ProgramlamaBI/SQL analisti

Pencereli fonksiyonlar ROW_NUMBER(), RANK(), DENSE_RANK() SQL rapor programlamada nasıl çalışır ve birbirlerinden neyle ayrılır? Kullanımlarında hangi tuzaklar vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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.

  • ROW_NUMBER() — her parti (bölüm) içindeki satırlara, belirtilen kıstasa göre sıralayarak benzersiz bir sıralı numara atar. ORDER BY'da aynı değerlere sahip olduğunda numaralandırmada atlamalar yapabilir.
  • RANK() — ORDER BY'da benzer değere sahip satırlara aynı rütbeyi verir, ancak sonraki elemanların numaralarını atlar (boşluk olacaktır).
  • DENSE_RANK() — aynı değere sahip satırlara yine benzer rütbe verir, ama numaralar kesintisiz bir şekilde sıralanır, atlama yapılmaz.

Ö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:

namesalary
Vasya10000
Petya10000
Masha9000

Sonuç:

namesalarynumrankdense_rank
Vasya10000111
Petya10000211
Masha9000332

Tuzaklar:

  • Yanlış seçilmiş ORDER BY, yanlış sıralamaya yol açabilir.
  • (row_number) ORDER BY’da benzersiz bir alan seçilmezse, kararlı bir sıralama garantisi yoktur.
  • PARTITION BY olmadan kullanım, tüm satır seti üzerinde yanlış numaralandırmaya yol açar.

Kandırmaca Soru

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ı.