Wprowadzenie do funkcji okienkowych w SQL
Funkcje okienkowe w SQL, takie jak ROW_NUMBER()
, RANK()
i DENSE_RANK()
, są niezwykle przydatne w analizie danych. Pozwalają one na przypisanie unikalnych numerów wierszom w ramach określonego okna danych, co jest szczególnie przydatne w raportowaniu i analizie. W tym artykule omówimy różnice między tymi trzema funkcjami, przedstawimy przykłady ich zastosowania oraz porównamy ich wyniki.
ROW_NUMBER()
Funkcja ROW_NUMBER()
przypisuje unikalny numer każdemu wierszowi w ramach określonego okna. Numeracja zaczyna się od 1 dla pierwszego wiersza w każdym oknie.
Przykład
Załóżmy, że mamy tabelę Pracownicy
z kolumnami Imie
, Dzial
i Wynagrodzenie
. Chcemy przypisać unikalny numer każdemu pracownikowi w ramach każdego działu, sortując według wynagrodzenia.
SELECT
Imie,
Dzial,
Wynagrodzenie,
ROW_NUMBER() OVER (PARTITION BY Dzial ORDER BY Wynagrodzenie DESC) AS Numer
FROM
Pracownicy;
Wynik:
Imie | Dzial | Wynagrodzenie | Numer |
---|---|---|---|
Jan | IT | 7000 | 1 |
Anna | IT | 6500 | 2 |
Piotr | HR | 5000 | 1 |
Maria | HR | 4500 | 2 |
RANK()
Funkcja RANK()
przypisuje numer wierszom w ramach określonego okna, ale w przypadku remisów (takich samych wartości w kolumnie sortującej) przypisuje ten sam numer, a następnie przeskakuje o odpowiednią liczbę miejsc.
Przykład
Używając tej samej tabeli Pracownicy
, przypiszmy rangi pracownikom w ramach każdego działu, sortując według wynagrodzenia.
SELECT
Imie,
Dzial,
Wynagrodzenie,
RANK() OVER (PARTITION BY Dzial ORDER BY Wynagrodzenie DESC) AS Ranga
FROM
Pracownicy;
Wynik:
Imie | Dzial | Wynagrodzenie | Ranga |
---|---|---|---|
Jan | IT | 7000 | 1 |
Anna | IT | 6500 | 2 |
Piotr | HR | 5000 | 1 |
Maria | HR | 4500 | 2 |
DENSE_RANK()
Funkcja DENSE_RANK()
działa podobnie do RANK()
, ale w przypadku remisów nie przeskakuje numerów. Oznacza to, że kolejne rangi są przypisywane bez przerw.
Przykład
Używając tej samej tabeli Pracownicy
, przypiszmy gęste rangi pracownikom w ramach każdego działu, sortując według wynagrodzenia.
SELECT
Imie,
Dzial,
Wynagrodzenie,
DENSE_RANK() OVER (PARTITION BY Dzial ORDER BY Wynagrodzenie DESC) AS GestaRanga
FROM
Pracownicy;
Wynik:
Imie | Dzial | Wynagrodzenie | GestaRanga |
---|---|---|---|
Jan | IT | 7000 | 1 |
Anna | IT | 6500 | 2 |
Piotr | HR | 5000 | 1 |
Maria | HR | 4500 | 2 |
Podsumowanie
Funkcje ROW_NUMBER()
, RANK()
i DENSE_RANK()
są potężnymi narzędziami w SQL, które pozwalają na zaawansowaną analizę danych. Każda z tych funkcji ma swoje unikalne zastosowania:
ROW_NUMBER()
przypisuje unikalny numer każdemu wierszowi.RANK()
przypisuje rangi z przerwami w przypadku remisów.DENSE_RANK()
przypisuje rangi bez przerw w przypadku remisów.
Zrozumienie różnic między tymi funkcjami pozwala na lepsze wykorzystanie ich w codziennej pracy z bazami danych, co może prowadzić do bardziej precyzyjnych i efektywnych analiz.