Jak działa PARTITION BY w języku SQL? Przykłady zastosowania

Jak działa PARTITION BY w języku SQL? Przykłady zastosowania

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 jak RANK(), 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:

  1. GROUP BY powoduje agregację – zwraca jedną wartość na każdą grupę.
  2. PARTITION BY działa w ramach funkcji okna, co pozwala na zachowanie oryginalnych wierszy.
  3. Użycie GROUP BY wymaga często HAVING, natomiast PARTITION 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

KajoDataSpace