29 Eylül 2021 Çarşamba

DENSE_RANK + OVER - Gruplar ve Her Gruba Sırayla Numara Verir

Giriş
DENSE_RANK() : Satırlar gruplanır. Bir gruptaki satırlara aynı sayıyı verir. Grup değişince bir sonraki sayıdan devam eder. Verilen sayılar arasında boşluk olmaz

RANK(): Satırlar gruplanır. Bir gruptaki satırlara aynı sayıyı verir. Grup değişince bir sonraki sayıdan devam etmez .

ORDER_BY(): Satırları gruplamaz. Sadece sayı verir.

Şeklen şöyle

Bir başka şekil şöyle



İki kullanım var
1. DENSE_RANK + OVER (PARTITION BY ...) : 
2. DENSE_RANK + OVER (ORDER BY ...)


1. DENSE_RANK + OVER (PARTITION BY ...)
PARTITION BY + ORDER BY grubun ilk n sayıdaki elemanını çekmek için kullanılır.
Örnek
Şöyle yaparız
SELECT * FROM ( SELECT ad,tarih ,DENSE_RANK() OVER(PARTITION BY ad ORDER BY tarih DESC) sira FROM kullanici) WHERE sira=1
Örnek
Elimizde şöyle bir tablo olsun
qid  segment task    before  after   diff
------------------------------------------
1       0    aaa       5     5       0
1       0    aaa       5     5       0
1       1    aaa       15    15      0
1       1    aaa       10    5      10
1       0    aaa       10    5       5
3       0    bbb       10    4       6
Bu tablodaki aynı task grubu için en büyük qid değerini ve ona ait segment değerini çekmek isteyelim. Yani çıktı şöyle olsun
task    before  after   diff
-----------------------------
aaa       25    20      10
bbb       10    4       6
Şöyle yaparız. task alanına göre gruplayıp, qid ve segment büyükten küçüğe sıralanır. Bu satıra rnk olarak 1 verilir. Daha sonra rnk = 1 olan satırlar seçilir.
with cte as
(
    select
        *,
        dense_rank() over (partition by task order by qid desc, segment desc) as rnk
    from myTable
)

select
    task,
    sum(before) as before,
    sum(after)  as after,
    sum(diff) as  diff
from cte
where rnk = 1
group by
    task
2. DENSE_RANK + OVER (ORDER BY ...)
DENSE_RANK + OVER (ORDER BY ...) yazısına taşıdım

Hiç yorum yok:

Yorum Gönder