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

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

Funkcja RANK() w języku SQL to jedno z najbardziej przydatnych narzędzi, które pomaga w porządkowaniu wyników zapytań według określonej kolejności. Jeśli kiedykolwiek zastanawiałeś się, jak przypisać rangę każdemu rekordowi w tabeli, to właśnie RANK() jest tym, czego potrzebujesz. W tym artykule wyjaśnię, jak działa ta funkcja, pokażę konkretne przykłady i omówię różnice względem pokrewnych funkcji.

Co to jest funkcja RANK() w SQL?

Funkcja RANK() w SQL służy do nadawania rang poszczególnym wynikom zapytania na podstawie określonego kryterium sortowania. Rangi przypisywane są w kolejności rosnącej i w przypadku powtórzenia wartości, kolejne rangi są pomijane.

Funkcję tę zalicza się do tzw. funkcji okna (window functions). Działa w obrębie podzbiorów danych, które są definiowane za pomocą klauzuli PARTITION BY.

Składnia funkcji RANK()

Podstawowa składnia funkcji RANK() wygląda następująco:

RANK() OVER (PARTITION BY kolumna_partycjonująca ORDER BY kolumna_sortująca ASC|DESC)

Główne elementy zapytania:

  • OVER() – określa zakres działania funkcji (partycjonowanie i sortowanie).
  • PARTITION BY – opcjonalny podział zbioru danych na grupy (jeśli nie występuje, ranking liczony jest dla całego zapytania).
  • ORDER BY – określa porządek sortowania, według którego przyznawana jest ranga.

Prosty przykład użycia funkcji RANK()

Załóżmy, że mamy tabelę Pracownicy zawierającą dane o pracownikach i ich wynagrodzeniach:

ID Imię Stanowisko Wynagrodzenie
1 Anna Manager 12000
2 Jan Inżynier 10000
3 Magda Inżynier 10000
4 Marek Technik 8000

Teraz chcemy nadać rangę pracownikom na podstawie ich wynagrodzenia, od najwyższego do najniższego. Wykorzystamy funkcję RANK():

SELECT ID, Imię, Stanowisko, Wynagrodzenie,
       RANK() OVER (ORDER BY Wynagrodzenie DESC) AS Ranga
FROM Pracownicy;

Wyniki będą wyglądać następująco:

ID Imię Stanowisko Wynagrodzenie Ranga
1 Anna Manager 12000 1
2 Jan Inżynier 10000 2
3 Magda Inżynier 10000 2
4 Marek Technik 8000 4

Widać tutaj, że Jan i Magda mają tę samą rangę (ponieważ mają to samo wynagrodzenie 10000), a kolejny rekord (Marek) otrzymuje rangę 4, a nie 3.

Różnice między RANK(), DENSE_RANK(), a ROW_NUMBER()

RANK() nie jest jedyną funkcją do numerowania wierszy. Warto znać różnice między nią a innymi pokrewnymi funkcjami:

  1. RANK(): Nadaje to samo miejsce dla identycznych wartości, a następnie przeskakuje numery.
  2. DENSE_RANK(): Działa podobnie jak RANK(), ale nie przeskakuje liczb.
  3. ROW_NUMBER(): Nadaje unikalną liczbę każdemu rekordowi, niezależnie od wartości.

Porównajmy ich zachowanie na podstawie wcześniejszej tabeli:

SELECT ID, Imię, Stanowisko, Wynagrodzenie,
       RANK() OVER (ORDER BY Wynagrodzenie DESC) AS Ranga,
       DENSE_RANK() OVER (ORDER BY Wynagrodzenie DESC) AS Gęsta_Ranga,
       ROW_NUMBER() OVER (ORDER BY Wynagrodzenie DESC) AS Numer_Wiersza
FROM Pracownicy;

Efekt w tabeli:

ID Imię Wynagrodzenie RANK() DENSE_RANK() ROW_NUMBER()
1 Anna 12000 1 1 1
2 Jan 10000 2 2 2
3 Magda 10000 2 2 3
4 Marek 8000 4 3 4

Podsumowanie

Funkcja RANK() w SQL to świetne narzędzie do przypisywania rang w zestawieniach. Jest przydatna szczególnie przy analizie danych, gdzie istotne jest uwzględnienie remisów i zachowanie logicznej kolejności numerowania. Warto również znać różnice między nią a funkcjami DENSE_RANK() oraz ROW_NUMBER(), aby dobrać odpowiednie rozwiązanie do konkretnej potrzeby.

 

Inny ciekawy artykuł:

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

KajoDataSpace