Funkcja agregująca SUM() sumuje wartości w całej grupie wierszy w zestawie wyników, zwracając jedną wartość dla każdej grupy (lub całego zapytania). Funkcja okna SUM() pozwala na obliczenie sumy w "oknie" wartości, zdefiniowanym w obrębie SELECT (poprzez OVER()), przy czym każdy wiersz jest zachowany w wyniku i ma dostęp do zgrupowanego wyniku w swoim "oknie". Jest to szczególnie wygodne do uzyskania pośrednich wyników według grup.
Przykład funkcji agregującej:
SELECT department_id, SUM(salary) FROM employees GROUP BY department_id;
Przykład funkcji okna:
SELECT department_id, salary, SUM(salary) OVER (PARTITION BY department_id ORDER BY hire_date) FROM employees;
„Czy można uzyskać skumulowaną («bieżącą») sumę w kolumnie tylko za pomocą funkcji agregującej GROUP BY?”
Odpowiedź: Nie! GROUP BY daje tylko ostateczne agregaty, bieżąca suma wymaga albo funkcji okna, lub skomplikowanych podzapytań, które są trudniejsze i wolniejsze.
Przykład:
SELECT salary, SUM(salary) OVER (ORDER BY hire_date) AS running_total FROM employees;
Historia
W raporcie transakcyjnym bieżąca suma została zrealizowana za pomocą wielu powiązanych podzapytań. W miarę wzrostu tabeli wydajność spadła kilkadziesiąt razy. Przeprowadzono na funkcję okna — wszystko wróciło do sekund.
Historia
Próba zrobienia skomplikowanej analizy z wynikami wg grup przez GROUP BY przełożyła się na kilka etapów zrzutu i przetwarzania w zewnętrznym oprogramowaniu. Funkcje okna pozwoliły na stworzenie potrzebnego raportu w jednym zapytaniu SQL.
Historia
Analityk napisał zapytanie z funkcjami okna, używając niewłaściwego PARTITION BY — wyniki dla różnych grup się pomieszały. Efekt — zniekształcone raporty. Po poprawieniu podziału na grupy dane stały się poprawne.