Database
 sql >> Baza danych >  >> RDS >> Database

Jaka jest różnica między RANK a DENSE_RANK w SQL?

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Prezentacje slajdów i próbki z #SQLintersection

  2. Jak usunąć duplikaty w SQL

  3. FieldShield SDK

  4. Jak uzyskać aktualną datę i godzinę (bez strefy czasowej) w T-SQL?

  5. Obsługa potwierdzenia e-mail podczas rejestracji w Flask