
Pracując z bazami danych, często spotykam się z potrzebą wykonywania operacji na podzbiorach danych. W takich sytuacjach niezwykle przydatna okazuje się klauzula PARTITION BY
w SQL. Dzięki niej mogę podzielić dane na grupy i wykonywać na nich funkcje analityczne.
Co to jest PARTITION BY?
Klauzula PARTITION BY
działa podobnie do GROUP BY
, ale z jedną istotną różnicą – zamiast grupować całe zapytanie, tworzy podziały w ramach wyniku i zachowuje oryginalne wiersze. To oznacza, że funkcje okna mogą operować w obrębie takich podzbiorów, zamiast przekształcać całą tabelę w pojedynczy wynik na grupę.
Jak działa PARTITION BY w języku SQL?
Składnia PARTITION BY
jest stosowana głównie z funkcjami analitycznymi (okna), takimi jak:
ROW_NUMBER()
– przypisuje numer kolejny w ramach danej grupy.RANK()
– przypisuje pozycję w rankingu, pozwalając na równorzędne lokaty.DENSE_RANK()
– działa jakRANK()
, ale nie zostawia luk w numeracji.SUM()
,AVG()
,COUNT()
– pozwalają sumować, średniować czy liczyć w ramach grupy.
Ogólna składnia wygląda tak:
SELECT
kolumna,
funkcja_analityczna() OVER (PARTITION BY kolumna_podziałowa ORDER BY kolumna_sortowania) AS alias
FROM tabela;
Przykłady zastosowania PARTITION BY
Aby lepiej zrozumieć działanie tej klauzuli, pokażę kilka przykładów.
Przypisanie numerów kolejnych w ramach grupy
Załóżmy, że w bazie mamy tabelę zamówienia
:
id | klient | kwota |
---|---|---|
1 | Alice | 100 |
2 | Bob | 200 |
3 | Alice | 150 |
4 | Bob | 300 |
Chcę przypisać każdemu zamówieniu numer w ramach danego klienta:
SELECT
id,
klient,
kwota,
ROW_NUMBER() OVER (PARTITION BY klient ORDER BY kwota DESC) AS numer_w_grupie
FROM zamówienia;
Wynik:
id | klient | kwota | numer_w_grupie |
---|---|---|---|
4 | Bob | 300 | 1 |
2 | Bob | 200 | 2 |
3 | Alice | 150 | 1 |
1 | Alice | 100 | 2 |
Sumowanie wartości w ramach grup
Teraz chcę obliczyć łączną wartość zamówień dla każdego klienta.
SELECT
id,
klient,
kwota,
SUM(kwota) OVER (PARTITION BY klient) AS suma_klienta
FROM zamówienia;
Wynik:
id | klient | kwota | suma_klienta |
---|---|---|---|
1 | Alice | 100 | 250 |
3 | Alice | 150 | 250 |
2 | Bob | 200 | 500 |
4 | Bob | 300 | 500 |
PARTITION BY a GROUP BY – kluczowe różnice
Często pojawia się pytanie, czym różni się PARTITION BY
od GROUP BY
. Oto najważniejsze różnice:
GROUP BY
powoduje agregację – zwraca jedną wartość na każdą grupę.PARTITION BY
działa w ramach funkcji okna, co pozwala na zachowanie oryginalnych wierszy.- Użycie
GROUP BY
wymaga częstoHAVING
, natomiastPARTITION BY
pozwala na filtrowanie wyników w bardziej elastyczny sposób.
Kiedy warto używać PARTITION BY?
Z mojego doświadczenia wynika, że PARTITION BY
sprawdza się szczególnie w przypadkach takich jak:
- Rankingowanie danych w ramach grup.
- Sumowanie i liczenie rekordów bez utraty szczegółowości.
- Obliczanie udziałów procentowych w obrębie kategorii.
- Znajdowanie wartości minimalnych, maksymalnych czy średnich w grupach.
Podsumowanie
Klauzula PARTITION BY
to potężne narzędzie w SQL, które pozwala na efektywne operacje na podzbiorach danych bez utraty szczegółowości rekordów. Dzięki funkcjom analitycznym mogę analizować i wyciągać bardziej precyzyjne informacje z bazy danych. Jego wykorzystanie znacząco upraszcza złożone zapytania i zwiększa możliwości analityczne w SQL.
Inny ciekawy artykuł:
Jak działa LAST_VALUE 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.