Jakie są różnice między ROW_NUMBER(), RANK(), DENSE_RANK() w SQL?

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.

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Scroll to Top