Grupowanie danych: Funkcje rankingowe w SQL cz. III
Funkcje rankingowe w SQL mogą być wywoływane tylko i wyłącznie dla utworzonych za pomocą klauzuli OVER() partycji. W przeciwieństwie do funkcji grupujących które mogą być uruchamiane między innymi dla grup utworzonych przy pomocy operatora GROUP BY.
UWAGA: Omawiany funkcje działają na bazach danych firmy Microsoft.
Najpopularniejsze funkcje rankingowe:
- ROW_NUMBER(),
- DENSE_RANK(),
- RANK(),
- NTILE().
Tabela pracownicy, na której będziemy uruchamiać przykładowe zapytania:
| ID | Imie | Nazwisko | Data_urodzenia | Stanowisko | Data_zatrudnienia |
| 1 | Jan | Kowalski | 1984-12-23 | Programista | 1999-12-09 |
| 2 | Adam | Adamiak | 1991-08-08 | Menadżer | 2011-01-31 |
| 3 | Jakub | Kowalik | 1990-03-16 | Programista | 2010-01-04 |
| 4 | Michał | Jakubiak | 1981-05-02 | Projektant | 1998-09-22 |
ROW_NUMBER
Funkcja ta zwraca numer wiersza, innymi słowy po prostu numeruje wiersze:
SELECT Imie, Nazwisko, ROW_NUMBER() OVER (ORDER BY Stanowisko) AS ROW_NUMBER FROM pracownicy;
W powyższym przykładzie należy zwrócić szczególną uwagę na klauzulę ORDER BY (służy ona do sortowania danych), bez niej otrzymamy błąd.
Efekt naszego zapytania:
| Imie | Nazwisko | ROW_NUMBER |
| Adam | Adamiak | 1 |
| Jakub | Kowalik | 2 |
| Jan | Kowalski | 3 |
| Michał | Jakubiak | 4 |
DENSE_RANK()
Numeruje wiersze, z takim wyjątkiem, że dla powtarzających się danych zwraca ten sam numer wiersza:
SELECT Stanowisko, DENSE_RANK() OVER (ORDER BY Stanowisko) AS DENSE_RANK FROM pracownicy;
Efekt:
| Stanowisko | DENSE_RANK |
| Menadżer | 1 |
| Programista | 2 |
| Programista | 2 |
| Projektant | 3 |
RANK()
Działa identycznie jak funkcja DENSE_RANK() czyli numeruje wiersze, z takim wyjątkiem, że dla powtarzających się danych zwraca ten sam numer wiersza:
SELECT Stanowisko, RANK() OVER (ORDER BY Stanowisko) AS ROW_NUMBER FROM pracownicy;
Efekt:
| Stanowisko | DENSE_RANK |
| Menadżer | 1 |
| Programista | 2 |
| Programista | 2 |
| Projektant | 3 |
NTILE()
NTILE() dzieli wiersze wygenerowane przez zapytanie, na określoną ilość bloków:
SELECT Imie, Nazwisko, NTILE(2) OVER (ORDER BY Stanowisko) AS NTILE FROM pracownicy;
Efekt:
| Imie | Nazwisko | NTILE |
| Adam | Adamiak | 1 |
| Jakub | Kowalik | 1 |
| Jan | Kowalski | 2 |
| Michał | Jakubiak | 2 |
Drugi przykład (dla nie parzystej liczby części w stosunku do liczby wierszy):
SELECT Imie, Nazwisko, NTILE(3) OVER (ORDER BY Stanowisko) AS NTILE FROM pracownicy;
Efekt:
| Imie | Nazwisko | NTILE |
| Adam | Adamiak | 1 |
| Jakub | Kowalik | 1 |
| Jan | Kowalski | 2 |
| Michał | Jakubiak | 3 |
Trzeci przykład:
SELECT Imie, Nazwisko, NTILE(4) OVER (ORDER BY Stanowisko) AS NTILE FROM pracownicy;
Podział na 4 części, czyli każdy wiersz to osobna część.
Efekt:
| Imie | Nazwisko | NTILE |
| Adam | Adamiak | 1 |
| Jakub | Kowalik | 2 |
| Jan | Kowalski | 3 |
| Michał | Jakubiak | 4 |