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 |