
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, PowerBI, Tableau i Pythona z certyfikatami!
🟨 Ekskluzywana ale pomagająca sobie społeczność.
🟩 Ponad 75 godzin materiałów video.
🟨 Spotkania LIVE co miesiąc.
🟩 Mój osobisty mentoring.

