Pencereli fonksiyonlar, satırları ayrı bir satıra gruplaşmadan, satırlar üzerinde "pencerede" hesaplamalar yapmanızı sağlar, bu da raporlama ve analiz için kullanışlıdır.
Örnek:
SELECT name, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS num, RANK() OVER (ORDER BY salary DESC) AS rank, DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank FROM employees;
Tablo:
| name | salary |
|---|---|
| Vasya | 10000 |
| Petya | 10000 |
| Masha | 9000 |
Sonuç:
| name | salary | num | rank | dense_rank |
|---|---|---|---|---|
| Vasya | 10000 | 1 | 1 | 1 |
| Petya | 10000 | 2 | 1 | 1 |
| Masha | 9000 | 3 | 3 | 2 |
Tuzaklar:
Eğer pencereli fonksiyonda PARTITION BY belirtilmezse, ROW_NUMBER() içinde satır numaralandırması nasıl yapılır?
Cevap: Tüm veri seçimi tek bir parti olarak kabul edilir. Yani numaralandırma, herhangi bir grup dikkate alınmadan tüm satırlara karşılık gelen sürekli bir şekilde yapılır.
Örnek:
SELECT *, ROW_NUMBER() OVER (ORDER BY salary DESC) FROM employees; -- Tüm çalışanlar departmanlara göre ayrıma gitmeden, 1’den başlayarak benzersiz numara alacaklar
Hikaye #1
BI raporunda departmana göre PARTITION BY belirtilmedi. Şirketin tüm çalışanları ardışık bir şekilde sürekli numaralandırıldı, ancak amaç her departmanın içindeki en iyileri tanımlamaktı. Sonuçta, departmanlar bazında hatalı bir TOP-N çalışan listesi oluştu.
Hikaye #2
Geliştirici, gruptan "en iyi"yi tanımlamak için ROW_NUMBER() yerine RANK() seçti — ancak aynı gösterimler nedeniyle aynı numaralar atanmıştı, bu da analitikte liderlerin görünmeyen tekrarlarını yarattı.
Hikaye #3
DENSE_RANK() kullanırken, boşlukları yasakladığını dikkate almadık, bu da satış analizinde "benzersiz" önemli pozisyonların sayısını çarpıttı. İş mantığı kontrolü, yer dağılımındaki hatayı ortaya çıkardı.