
Gdy pracuję z bazami danych, często potrzebuję wykonywać analizy, które wymagają bardziej zaawansowanych obliczeń niż standardowe funkcje agregujące typu SUM()
czy AVG()
. I właśnie tutaj na scenę wchodzą window functions, czyli funkcje okna w SQL. Pozwalają one wykonywać operacje na zbiorach wierszy w ramach określonego zestawu danych, bez konieczności grupowania wyników jak przy użyciu GROUP BY
.
Co to są WINDOW FUNCTIONS?
Window functions w SQL pozwalają na wykonywanie operacji analitycznych na pewnej części zestawu wyników – zwanej oknem – jednocześnie zwracając wartości dla każdego wiersza z oryginalnej tabeli. Dzięki temu możemy tworzyć bardziej skomplikowane analizy danych w SQL bez pisania skomplikowanych podzapytań.
Funkcje te działają w obrębie pewnej grupy wierszy (okna), które definiujemy w klauzuli OVER()
, określając zakres (PARTITION BY) i kolejność (ORDER BY).
Podstawowa składnia funkcji okna SQL
Podstawowa składnia funkcji okna wygląda tak:
funkcja_okna() OVER (
[PARTITION BY kolumna1, kolumna2, ...]
[ORDER BY kolumna3 ASC|DESC]
)
Gdzie:
funkcja_okna()
– to funkcja analityczna, np.RANK()
,SUM()
,AVG()
.PARTITION BY
– opcjonalne, dzieli dane na podgrupy (okna).ORDER BY
– opcjonalne, określa kolejność w obrębie okna.
Przykłady zastosowania funkcji okna
Najlepiej zrozumieć ich działanie na przykładach. Załóżmy, że mamy tabelę sprzedaz
z danymi sprzedażowymi:
id | sprzedawca | region | kwota |
---|---|---|---|
1 | Alicja | Północ | 1000 |
2 | Jan | Południe | 1200 |
3 | Alicja | Północ | 900 |
4 | Jan | Południe | 1500 |
5 | Karol | Zachód | 800 |
6 | Karol | Zachód | 950 |
SUMA SPRZEDAŻY – PARTITION BY
Chcę obliczyć sumę sprzedaży każdego sprzedawcy, ale bez grupowania wyników, czyli chcę zachować wszystkie rekordy:
SELECT sprzedawca, region, kwota,
SUM(kwota) OVER(PARTITION BY sprzedawca) AS suma_sprzedazy
FROM sprzedaz;
Wynik:
sprzedawca | region | kwota | suma_sprzedazy |
---|---|---|---|
Alicja | Północ | 1000 | 1900 |
Alicja | Północ | 900 | 1900 |
Jan | Południe | 1200 | 2700 |
Jan | Południe | 1500 | 2700 |
Karol | Zachód | 800 | 1750 |
Karol | Zachód | 950 | 1750 |
RANKING SPRZEDAWCÓW – ORDER BY
Teraz chcę nadać każdemu sprzedawcy ranking na podstawie jego sprzedaży od największej do najmniejszej:
SELECT sprzedawca, region, kwota,
RANK() OVER(ORDER BY kwota DESC) AS ranking
FROM sprzedaz;
Wynik:
sprzedawca | region | kwota | ranking |
---|---|---|---|
Jan | Południe | 1500 | 1 |
Jan | Południe | 1200 | 2 |
Alicja | Północ | 1000 | 3 |
Karol | Zachód | 950 | 4 |
Alicja | Północ | 900 | 5 |
Karol | Zachód | 800 | 6 |
RÓŻNICA W SPRZEDAŻY – LEAD()
Funkcja LEAD()
umożliwia porównanie wartości z następnym wierszem. Załóżmy, że chcę zobaczyć różnicę sprzedaży danego sprzedawcy między kolejnymi transakcjami:
SELECT sprzedawca, kwota,
kwota - LEAD(kwota) OVER(PARTITION BY sprzedawca ORDER BY kwota DESC) AS roznica
FROM sprzedaz;
Najpopularniejsze funkcje okna
Oto kilka przydatnych funkcji okna w SQL:
- SUM() – suma wartości w obrębie okna.
- AVG() – średnia wartości.
- RANK() – nadaje numer, pozwalając na ex aequo.
- DENSE_RANK() – jak
RANK()
, ale bez pominięcia numeracji. - ROW_NUMBER() – unikalny numer wiersza w obrębie okna.
- LEAD() – zwraca kolejną wartość.
- LAG() – zwraca poprzednią wartość.
Podsumowanie
Funkcje okna w SQL to potężne narzędzie, które pozwala analizować dane w znacznie bardziej elastyczny sposób niż standardowe funkcje agregujące. Umożliwiają operacje na zbiorach wierszy bez ich grupowania, co czyni je świetnym narzędziem do raportowania i analizy biznesowej. Warto znać i wykorzystywać je w swoich zapytaniach!
Inny ciekawy artykuł:
Jak działa RECURSIVE CTE w języku SQL? Przykłady zastosowania
Opanuj SQL z moim kursem!
Poznasz zarówno podstawy, jak i zaawansowane zapytania analityczne (CTE, subqueries, window functions). Nauczysz się pracować na różnych silnikach – na kursie pracujemy zarówno na MySQL, jak i na Postgres. Wszystko zainstalujemy na Twoim komputerze, plus dostaniesz mnóstwo zestawów danych do ćwiczeń.
Zostań analitykiem danych – dołącz do KajoDataSpace!
Najlepsza ścieżka do zawodu analityka danych. Dostęp do pełnych wersji kursów online z Excela, SQLa, Tableau i Pythona z certyfikatami + specjalistycznych webinarów z PowerBI.
Ekskluzywana ale pomagająca sobie społeczność.
Ponad 61 godzin materiałów video.
Spotkania LIVE co miesiąc.
Mój osobisty mentoring.