CodeGym /Kursy /SQL SELF /Funkcje okienne: ukryta supermoc SQL

Funkcje okienne: ukryta supermoc SQL

SQL SELF
Poziom 29 , Lekcja 0
Dostępny

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:

  1. 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.

  2. 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!

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION