1. Anasayfa
  2. SQL Server

T-SQL Window Functions Nedir? Nasıl Çalışır?


0

SQL Window fonksiyonları ihtiyaç duyana kadar varlığını ve kullanımını çok da sorgulamadığımız ama ihtiyaç duyduğumuzda ve doğru şekilde kullandığımızda, geliştirme süremizi kısaltacak, bizi gereksiz döngülerden, cursorlardan kurtaracak ve performans kazandıracak, küçük devlerdir…

Tüm Window fonksiyonları tek bir yazı içerisinde bir karmaşaya dönüştürmektense, bu yazımızda SQL 2005 ile gelen ROW_NUMBER, RANK, DENSE_RANK, NTILE ile bu konuya giriş yapacağız.

ROW_NUMBER;

Örnek için AdventureWork’de HumanResources.Employee tablosunu kullanacağım. Tüm personel kayıtları için satır numaraları üretmek istiyorum.

SELECT row_number() over(order by JobTitle) SatirNo,*

FROM [HumanResources].[Employee]


Resim-1

Örnekten de görüleceği gibi, satır numarası üretmek için çok kolay bir yol. Satır Numarası değil personel numarası istiyorum derseniz;

SELECT row_number() over(order by JobTitle)+10000 PersonelId,*

FROM [HumanResources].[Employee]

Şeklinde bir yazımla 5 basamaklı personel ID’leri elde edebiliriz.

RANK;

Derecelendirmede, sınıflandırmada kullanabileceğimiz bir fonksiyondur. Örneğimiz için Employee tablomuzda her unvan için bir Id oluşturalım.

SELECT rank() over(order by JobTitle) UnvanId,JobTitle,*

FROM [HumanResources].[Employee]


Resim-2

Sorguda Over koşulu içerisinde belirttiğimiz JobTitle alanı, seviye oluşturmak istediğimiz alan, sonuç çıktısınız incelersek, unvanlar bazında Unique olacak ID’ler türettiğini görebiliriz. Çıktıyı detaylı incelediğimizde UnvanIdleri arasında rakamların atlayarak ilerlediğini (1,3,4,6,9…) görürüz. Rank fonksiyonumuz numaralandırmaya 1 den başladı, ikinci satırın da unvanı aynı olduğu için ikinci satıra da 1 rank verdi. Üçüncü satıra geldiğimizde farklı bir unvan bilgisi var Rank fonksiyonumuz yeni bir Id verecek ve bu Id bulunduğumuz satırın numarası olan 3 olacak. Satırlarda ilerlersek davranış modelini daha net anlayabiliriz. Farklı unvan Data’sının olduğu ilk satırın numarası ona eş olan tüm unvanlar için kullanılıyor.

Artan sayıda normal bir numaralandırma yapsa daha hoş olur dediğinizi duyar gibiyim; bu da bizi bir sonraki fonksiyonumuza götürecek.

DENSE_RANK;

Kullanım olarak rank fonksiyonunun eşi olan dense_rank da, rank örneğinde gördüğümüz numaralandırma sırasında atlanan sayılar olmayacaktır.


Resim-3

NTILE;

Ntile bizim Data’yı eşit parçalara bölmekte kullanabileceğimiz fonksiyonumuz. Yazılış olarak ilk 3 fonksiyonumuzdan küçük bir farkı var;

SELECT ntile(4) over(order by JobTitle) TakimId,*

FROM [HumanResources].[Employee]

Ntile fonksiyonumuz parça sayısını belirleyecek bir sayısal parametre de alıyor. Sorgumuz unvanları kullanarak tüm ekibimizi 4 eşit parçaya bölecek.


Resim-4

Sonuçları incelersek;

1 = 73 adet

2 = 73 adet

3 = 72 adet

4 = 72 adet şeklinde parçalara böldüğünü görebiliriz.

Sonraki yazılarda Window fonksiyonlarla çalışmayı sürdüreceğiz, özellikle SQL Server 2012 ile gelen çok faydalı Window fonksiyonlar var, bunları da inceleyip örnekler yapacağız.

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

Bu İçeriğe Tepkin Ne Oldu?
  • 2
    harika_
    Harika!!
  • 1
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 1
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

İstanbul Üniversitesi Bilgisayar Mühendisliği mezunudur. Kariyerine yazılım ile başlamış olup, zaman içerisinde .Net ve Dynamics Axapta üzerinde geliştirmeler yapmıştır. Son yıllarda yoğun olarak, veritabanı teknolojileri, iş zekası ve raporlama sistemleri ile ilgilenmektedir. Eroğlu Holding'de Bilgi Teknolojileri Proje Lideri olarak çalışmaktadır.

Yazarın Profili

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir