Poznałeś już
ROW_NUMBER() i RANK() liczone dla całej tabeli. Teraz wejdziemy na sam szczyt Strażnicy: nauczymy się dzielić wiersze na grupy i liczyć funkcje okna osobno w każdej grupie. Służy do tego klauzula PARTITION BY.Wyobraź sobie, że chcesz ranking ksiąg według ceny, ale wewnątrz każdej kategorii z osobna. Bez
PARTITION BY numerowalibyśmy wszystkie księgi razem. Z nią - licznik resetuje się przy każdej nowej kategorii:1SELECT tytul, kategoria_id, cena,
2 ROW_NUMBER() OVER (PARTITION BY kategoria_id ORDER BY cena DESC) AS miejsce
3FROM ksiazki;W kategorii 1 najdroższa księga dostanie
miejsce = 1, kolejna 2, i tak dalej. Gdy przejdziemy do kategorii 2, licznik zaczyna od nowa. To jak osobny ranking na każdym regale.W klauzuli
OVER (...) najpierw piszemy PARTITION BY (czym dzielimy), a potem ORDER BY (jak porządkujemy wewnątrz grupy):1OVER (PARTITION BY kategoria_id ORDER BY cena DESC)Najciekawsze jest to, że zwykłe agregaty -
AVG, SUM, COUNT, MAX, MIN - też mogą działać jako funkcje okna. Wystarczy dodać OVER (...). Wtedy nie zwijają wierszy, tylko dopisują wynik obok każdego z nich:1SELECT tytul, kategoria_id, cena,
2 AVG(cena) OVER (PARTITION BY kategoria_id) AS srednia_kat
3FROM ksiazki;Każda księga zachowa swój wiersz, ale obok pojawi się średnia cena jej kategorii. Dzięki temu od razu widać, czy dana księga jest droższa, czy tańsza od średniej na swoim regale - bez osobnego zapytania z
GROUP BY.| Cecha | GROUP BY | Funkcja okna (OVER) | |-------|----------|---------------------| | Liczba wierszy | zwija do jednego na grupę | zachowuje wszystkie | | Widać szczegóły | nie | tak | | Po co? | podsumowania | porównania wiersz po wierszu |
To najpotężniejsze narzędzie analityczne Biblioteki. Z
PARTITION BY Strażnik widzi jednocześnie całość i szczegół - i nic mu nie umknie.