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 |