Window function nedir? ROW_NUMBER, RANK ve DENSE_RANK arasındaki fark nedir?
Cevap
Window function, GROUP BY gibi satırları tek satıra indirgemeden, her satır için ilişkili bir satır kümesi (pencere) üzerinde hesap yapar. OVER (...) ifadesiyle tanımlanır.
SELECT ad, departman, maas,
AVG(maas) OVER (PARTITION BY departman) AS dept_ort,
ROW_NUMBER() OVER (PARTITION BY departman ORDER BY maas DESC) AS rn,
RANK() OVER (PARTITION BY departman ORDER BY maas DESC) AS rnk,
DENSE_RANK() OVER (PARTITION BY departman ORDER BY maas DESC) AS drnk
FROM calisanlar;PARTITION BY: pencereyi gruplara böler (opsiyonel).ORDER BY: pencere içindeki sırayı belirler.
Sıralama fonksiyonları (maaşlar: 100, 100, 90)
| maas | ROW_NUMBER | RANK | DENSE_RANK |
|---|---|---|---|
| 100 | 1 | 1 | 1 |
| 100 | 2 | 1 | 1 |
| 90 | 3 | 3 | 2 |
ROW_NUMBER: eşitlikte bile benzersiz numara verir.RANK: eşitlere aynı sırayı verir, sonra boşluk bırakır.DENSE_RANK: eşitlere aynı sırayı verir, boşluk bırakmaz.
Sık kullanılan diğerleri
LAG(col)/LEAD(col): önceki/sonraki satırın değeri (ör. günlük değişim).SUM(col) OVER (ORDER BY tarih): kümülatif toplam (running total).
Klasik örnek: her departmanın en yüksek maaşlı 2 çalışanı
SELECT * FROM (
SELECT *, DENSE_RANK() OVER (PARTITION BY departman ORDER BY maas DESC) AS r
FROM calisanlar
) t
WHERE r <= 2;Window function'lar WHERE içinde doğrudan kullanılamaz (WHERE'den sonra hesaplanırlar); bu yüzden alt sorgu veya CTE gerekir.
İlgili Veritabanı & SQL soruları
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.