SUM() agregat fonksiyonu, sonuç kümesindeki grup satırlarının toplam değerlerini toplar ve her grup (veya tüm sorgu) için tek bir değer döndürür. SUM() pencere fonksiyonu, SELECT içinde tanımlanan bir "penceredeki" değerler üzerinde toplam hesaplamasına olanak tanır (OVER() ile), bu sırada her satır sonuçta korunur ve kendi "penceresindeki" agregat sonuca erişim sağlar. Bu, gruplar için ara toplamlar elde etmek için özellikle kullanışlıdır.
Agregat fonksiyonuna bir örnek:
SELECT department_id, SUM(salary) FROM employees GROUP BY department_id;
Pencere fonksiyonuna bir örnek:
SELECT department_id, salary, SUM(salary) OVER (PARTITION BY department_id ORDER BY hire_date) FROM employees;
“Kümülatif (biriken) toplamı bir sütun üzerinde yalnızca agregat fonksiyonu GROUP BY kullanarak elde etmek mümkün mü?”
Cevap: Hayır! GROUP BY yalnızca nihai agregatları verir, biriken toplam ya pencere fonksiyonu gerektirir ya da daha karmaşık alt sorgular gerektirir ki bu da daha karmaşık ve yavaş çalıştırır.
Örnek:
SELECT salary, SUM(salary) OVER (ORDER BY hire_date) AS running_total FROM employees;
Hikaye
İşlem raporunda koşullu biriken toplam, birçok ilgili alt sorgu ile gerçekleştirildi. Tablo büyüdükçe performans on kat düştü. Pencere fonksiyonuna geçtik — her şey saniyelere döndü.
Hikaye
GROUP BY kullanarak gruplar üzerinde karmaşık analiz yapma girişimi, dış yazılımda birden fazla aşama ile veri yükleme ve işleme sürecine dönüştü. Pencere fonksiyonları, ihtiyacımız olan raporu tek bir SQL sorgusunda yapmamızı sağladı.
Hikaye
Bir analist, hatalı bir PARTITION BY kullanarak pencere fonksiyonlarıyla bir sorgu yazdı — farklı gruplar için sonuçlar karıştı. Sonuç — çarpıtılmış raporlamaydı. Gruplar üzerindeki bölme düzeltildiğinde veriler doğru hale geldi.