Anasayfa / Yazılım / SQL / RANK ve DENSE_RANK Fonksiyonları

RANK ve DENSE_RANK Fonksiyonları

RANK ve DENSE_RANK Fonksiyonları ROW_NUMBER fonksiyonuna çok benzemektedir. Farkı ORDER_BY deyimi ile bu fonksiyonların birbiri arasındaki bağlantılarıdır. RANK fonksiyonu ile tekrar eden satırlara aynı numaralar verilir ve kullanılmayan numaralar geçilir. DENSE_RANK fonksiyonunda ise kullanılmayan numaralar geçilmez. Bunu en güzel bir örnekle anlatabiliriz :

SELECT CustomerID, COUNT(*) AS "Satış Sayısı",
RANK() OVER(ORDER BY COUNT(*) DESC) AS "Rank ile Sıralama",
ROW_NUMBER() OVER(ORDER BY COUNT(*) DESC) AS "Normal Sıralama",
DENSE_RANK() OVER(ORDER BY COUNT(*) DESC) AS "Dense_Rank ile Sıralama"
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
ORDER BY COUNT(*) DESC;

Şimdi örneğimizin sonucu görelim sonra açıklama yapayım.

2013021101

Şimdi bu örneğimizde Sales.SalesOrderHeader tablosundaki verileri listeliyoruz. Görüldüğü üzere CustomerId ve Satış Sayısı kolonlarımız mevcut. Burada satış sayısı kolonunu baz alarak bir takım sıralamalar oluşturduk. İlk kolonumuz RANK ile sıralama yapıyor. Burada dikkat edeceğiniz üzere ilk satırdaki verimiz 28 ve ikincisi de 28, dolayısı ile RANK ile sıralama kolonu birinci satır 1, ikinci satır 1 oluyor. Daha sonra Satış Sayısı kolonu 27 oluyor ve tam tamına 11 tane 27 var. Bunların hepsine de RANK ile 3 değeri atanıyor. Daha sonra gelen 25’in karşısında 14 var ve daha sonra gelen 17’nin karşısında ise 15 var ve bu şekilde sıralı olarak gidiyor. Yani RANK’ın sıralama algoritması bu şekilde.. Tekrarlayan satırlardaki verilere aynı değeri veriyor ve bu tekrarlanan kadar değeri sıralamasında atlıyor.

Peki DENSE_RANK’a bakalım.

Burada da ilk satırda 28 değeri var ve karşısında 1 var ikincisinde yine 28 ve karşısında 1 var. Daha sonra 27 var ve karşısında 3 var. Bu şekilde sırala ile gidiyor. Yani DENSE_RANK fonksiyonunda aynı değere sahip satırlara aynı değer veriliyor ama sıralama algoritmasında hiç bir rakam atlanmıyor.

Bir sonraki yazımda görüşmek üzere..

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir