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

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

Yazı gezinmesi

Mobil sürümden çık