Problem:
Chcesz porównać rankingi stworzone przez RANK
i DENSE_RANK
i dodaj je jako nowe kolumny do tabeli.
Przykład:
Nasza baza danych zawiera tabelę o nazwie sales_assistant
z danymi w następujących kolumnach:id
(klucz podstawowy), first_name
, last_name
, month
i sold products
.
id | imię | nazwisko | miesiąc | sprzedane produkty |
---|---|---|---|---|
1 | Lisa | Czarny | 5 | 2300 |
2 | Maryi | Jacobs | 5 | 2400 |
3 | Lisa | Czarny | 6 | 2700 |
4 | Maryi | Jacobs | 6 | 2700 |
5 | Alek | Kowalski | 6 | 2900 |
6 | Maryi | Jacobs | 7 | 1200 |
7 | Lisa | Czarny | 7 | 1200 |
8 | Alek | Kowalski | 7 | 1000 |
Wyświetlmy imię i nazwisko każdego sprzedawcy oraz liczbę sprzedanych produktów. Chcemy również uszeregować je pod względem liczby sprzedanych produktów w porządku malejącym.
Rozwiązanie 1:
SELECT RANK() OVER(ORDER BY sold products DESC) AS r, DENSE_RANK() OVER(ORDER BY sold products DESC) AS dr, first_name, last_name, month, sold products FROM sales_assistant;
To zapytanie zwraca dwa rankingi:jeden utworzony przez RANK
i kolejny przez DENSE_RANK
. Jaka jest różnica?
Mówiąc najprościej, RANK
pomija liczbę pozycji po rekordach o tym samym numerze rangi. Ranking RANK_DENSE
zwraca numery pozycji od 1 do 6, ponieważ nie pomija rekordów o tym samym numerze pozycji:
r | dr | imię | nazwisko | miesiąc | sprzedane produkty |
---|---|---|---|---|---|
1 | 1 | Alek | Kowalski | 6 | 2900 |
2 | 2 | Lisa | Czarny | 6 | 2700 |
2 | 2 | Maryi | Jacobs | 6 | 2700 |
4 | 3 | Maryi | Jacobs | 5 | 2400 |
5 | 4 | Lisa | Czarny | 5 | 2300 |
6 | 5 | Maryi | Jacobs | 7 | 1200 |
6 | 5 | Lisa | Czarny | 7 | 1200 |
8 | 6 | Alek | Kowalski | 7 | 1000 |
Dyskusja:
Jeśli chcesz uszeregować wiersze w zestawie wyników, SQL oferuje RANK()
i DENSE_RANK
Funkcje. Te funkcje są używane w SELECT
z innymi kolumnami. Po RANK
lub DENSE_RANK
, wywołujemy OVER()
funkcja, która przyjmuje ORDER BY
klauzula z nazwą kolumny do sortowania przed przypisaniem rankingu.
W przeciwieństwie do DENSE_RANK
, RANK
pomija pozycje po równych rankingach. Liczba pominiętych pozycji zależy od tego, ile wierszy ma identyczny ranking. Na przykład Mary i Lisa sprzedały taką samą liczbę produktów i obie znalazły się na 2. miejscu. Z RANK
, następna pozycja to #4; z DENSE_RANK
, następna pozycja to #3.
Obie RANK
i RANK_DENSE
praca na partycjach danych:
Rozwiązanie 1:
SELECT RANK() OVER(PARTITION BY month ORDER BY sold products DESC) AS r, DENSE_RANK() OVER(PARTITION BY month ORDER BY sold products DESC) AS dr, first_name, last_name, month, sold products FROM sales_assistant;
Możesz podzielić rekordy na grupy według podanej kolumny (w naszym przykładzie month
). W takiej sytuacji rekordy są klasyfikowane jako część partycji:
r | dr | imię | nazwisko | miesiąc | sprzedane produkty |
---|---|---|---|---|---|
1 | 1 | Maryi | Jacobs | 5 | 2400 |
2 | 2 | Lisa | Czarny | 5 | 2300 |
1 | 1 | Alek | Kowalski | 6 | 2900 |
2 | 2 | Lisa | Czarny | 6 | 2700 |
2 | 2 | Maryi | Jacobs | 6 | 2700 |
1 | 1 | Maryi | Jacobs | 7 | 1200 |
1 | 1 | Lisa | Czarny | 7 | 1200 |
3 | 2 | Alek | Kowalski | 7 | 1000 |