Na pierwszy rzut oka może się wydawać, że SQL już ma wszystko do analizy danych: GROUP BY, agregaty, subquery... Ale to dopiero początek. Witaj w świecie funkcji okiennych — potężnego narzędzia, które pozwala pracować z danymi wiersz po wierszu, zachowując cały kontekst.
Funkcje okienne pozwalają robić obliczenia — sumę, średnią, rangi i inne — po „oknie” wierszy, bez zwijania danych. To znaczy, że w przeciwieństwie do zwykłych funkcji agregujących (SUM(), AVG(), COUNT()), dostajesz i wynik, i szczegóły w każdym wierszu.
Wyobraź sobie, że chcesz policzyć skumulowany dochód po zamówieniach. Z GROUP BY straciłbyś konkretne zamówienia — zostałaby tylko suma. A z funkcją okienną dodasz wynik bezpośrednio do każdego wiersza, nic nie tracąc.
Funkcje okienne są szczególnie wygodne, bo nie niszczą danych: każdy wiersz zostaje na swoim miejscu, a wyniki obliczeń po prostu pojawiają się w nowych kolumnach. To pozwala robić zaawansowaną analizę bez subquery i ciężkich konstrukcji — wszystko dzieje się w jednym zapytaniu. Takie funkcje są idealne do zadań typu ranking, liczenie średnich kroczących czy porównywanie wartości między wierszami. Kod zostaje czytelny, a wynik — dokładny.
Kiedy to szczególnie przydatne:
- Ranking pracowników, sprzedawców, produktów — kto na którym miejscu.
- Szeregi czasowe — jak coś się zmieniało dzień po dniu lub tydzień po tygodniu.
- Sprzedaż i finanse — ile się nazbierało na każdym kroku, które zamówienia są powyżej średniej, kto jest w top 25%.
Gdzie stosuje się funkcje okienne
W każdej dziedzinie, gdzie ważny jest kontekst, a nie tylko wynik końcowy:
- raporty sprzedażowe;
- analiza zachowań klientów;
- budowanie wykresów z metrykami skumulowanymi;
- segmentacja danych (np. po kwartylach);
- obliczanie odchyleń i trendów.
To prawdziwy skarb dla analityków, którzy pracują z SQL na co dzień. Zobaczmy kilka przykładów z życia, gdzie funkcje okienne mogą być twoim wybawieniem.
Przykład 1: Ranking danych
Wyobraź sobie, że masz listę studentów z ich ocenami z egzaminu. Chcesz przypisać każdemu studentowi jego pozycję w klasie. Z funkcjami okiennymi to dziecinnie proste. Na przykład funkcje RANK() albo ROW_NUMBER() świetnie się tu sprawdzą.
Przykład 2: Analiza danych czasowych
A co, jeśli trzeba sprawdzić, jak dochody firmy zmieniały się miesiąc po miesiącu? Potrzebujesz skumulowanej sumy dochodów. Używając funkcji okiennej SUM() z odpowiednim oknem, łatwo to uzyskasz.
Przykład 3: Kwantyle i podział na grupy
Podzielić dane na równe grupy (np. według dochodów) do segmentacji klientów? Tu pomoże funkcja NTILE(). Sprawdźmy, którzy klienci są w top 25%, a którzy na dole rankingu.
Jak to wygląda?
Funkcja okienna po prostu dodaje wynik do końcowego zestawu danych:
SELECT
student_id,
grade,
RANK() OVER (ORDER BY grade DESC) AS rank
FROM
students;
Tu dostajemy tabelę, gdzie każdy student ma swoją unikalną rangę według oceny.
Prosta analogia
Wyobraź sobie, że biegniesz z grupą znajomych. Każdy biegnie swoim tempem, ale chcesz wiedzieć, które miejsce zajmujesz w biegu właśnie teraz. Zamiast zatrzymać wszystkich i zrobić tabelę liderów (jak robi GROUP BY), po prostu patrzysz na tych, którzy biegną obok i określasz swoją aktualną pozycję.
To właśnie funkcja okienna: nie zatrzymuje biegu, nie dzieli wszystkich na grupy — po prostu dodaje informację, zachowując ruch i szczegóły. Każdy biegnie dalej, ale masz dodatkową analizę — np. ile osób jest przed tobą, jakie masz tempo w porównaniu do średniej itd.
Zalety w porównaniu do tradycyjnych podejść
Weźmy klasyczne zadanie: liczenie rangi sprzedawców według dochodu. Są dwa podejścia:
Bez funkcji okiennych. Musisz zrobić subquery albo nawet kilka subquery, żeby najpierw posortować dane, potem je ponumerować. To nie tylko długie, ale i ciężko się czyta.
Z funkcjami okiennymi. Jedno zapytanie z ładną i czytelną składnią, a wynik już masz. Na przykład:
SELECT
seller_id,
revenue,
RANK() OVER (PARTITION BY region ORDER BY revenue DESC) AS rank_in_region
FROM
sales;
To zapytanie od razu dzieli sprzedawców według regionów i numeruje ich malejąco według dochodu.
Prawdziwy przykład
Wyobraź sobie, że jesteś analitykiem i analizujesz dane sprzedażowe. Musisz sprawdzić:
- skumulowane dochody za każdy miesiąc,
- jak zmienił się dochód w porównaniu do poprzedniego miesiąca,
- ranking regionów według całkowitego dochodu.
To wszystko da się zrobić z funkcjami okiennymi, nawet w jednym zapytaniu. Ale to już temat na kolejne lekcje.
Teraz, mając podstawową wiedzę o funkcjach okiennych, jesteś gotowy przejść do ich składni i zobaczyć moc funkcji ROW_NUMBER(), RANK(), DENSE_RANK() i NTILE(). Lecimy do następnej lekcji!
GO TO FULL VERSION