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
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 olsuntask 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