Database
 sql >> Datenbank >  >> RDS >> Database

Was ist der Unterschied zwischen RANK und DENSE_RANK in SQL?

Problem:

Sie möchten die von RANK erstellten Rankings vergleichen und DENSE_RANK und fügen Sie sie als neue Spalten zu einer Tabelle hinzu.

Beispiel:

Unsere Datenbank hat eine Tabelle namens sales_assistant mit Daten in den folgenden Spalten:id (Primärschlüssel), first_name , last_name , month und sold products .

id Vorname Nachname Monat verkaufte Produkte
1 Lisa Schwarz 5 2300
2 Maria Jacobs 5 2400
3 Lisa Schwarz 6 2700
4 Maria Jacobs 6 2700
5 Alex Smith 6 2900
6 Maria Jacobs 7 1200
7 Lisa Schwarz 7 1200
8 Alex Smith 7 1000

Lassen Sie uns den Vor- und Nachnamen jedes Verkäufers und die Anzahl der verkauften Produkte anzeigen. Wir möchten sie auch nach der Anzahl der verkauften Produkte in absteigender Reihenfolge ordnen.

Lösung 1:

SELECT RANK() OVER(ORDER BY verkaufte Produkte DESC) AS r, DENSE_RANK() OVER(ORDER BY verkaufte Produkte DESC) AS dr, Vorname, Nachname, Monat, verkaufte ProdukteFROM sales_assistant;

Diese Abfrage gibt zwei Rankings zurück:eines, das von RANK erzeugt wird und ein weiterer von DENSE_RANK . Was ist der Unterschied?

Einfach ausgedrückt, RANK überspringt die Anzahl der Positionen nach Datensätzen mit derselben Rangnummer. Das Ranking RANK_DENSE gibt Positionsnummern von 1 bis 6 zurück, da Datensätze mit derselben Rangnummer nicht übersprungen werden:

r dr Vorname Nachname Monat verkaufte Produkte
1 1 Alex Smith 6 2900
2 2 Lisa Schwarz 6 2700
2 2 Maria Jacobs 6 2700
4 3 Maria Jacobs 5 2400
5 4 Lisa Schwarz 5 2300
6 5 Maria Jacobs 7 1200
6 5 Lisa Schwarz 7 1200
8 6 Alex Smith 7 1000

Diskussion:

Wenn Sie Zeilen in der Ergebnismenge ordnen möchten, bietet SQL den RANK() an und DENSE_RANK Funktionen. Diese Funktionen werden in SELECT verwendet mit anderen Spalten. Nach RANK oder DENSE_RANK , rufen wir OVER() auf Funktion, die einen ORDER BY entgegennimmt -Klausel mit dem Namen der zu sortierenden Spalte, bevor eine Rangfolge zugewiesen wird.

Im Gegensatz zu DENSE_RANK , RANK überspringt Positionen nach gleichen Platzierungen. Die Anzahl der übersprungenen Positionen hängt davon ab, wie viele Zeilen eine identische Rangfolge hatten. Zum Beispiel haben Mary und Lisa die gleiche Anzahl von Produkten verkauft und stehen beide auf Platz 2. Mit RANK , die nächste Position ist #4; mit DENSE_RANK , die nächste Position ist #3.

Beide RANK und RANK_DENSE an Datenpartitionen arbeiten:

Lösung 1:

SELECT RANK() OVER(PARTITION BY month ORDER BY verkaufte Produkte DESC) AS r, DENSE_RANK() OVER(PARTITION BY month ORDER BY verkaufte Produkte DESC) AS dr, Vorname, Nachname, Monat, verkaufte ProdukteFROM sales_assistant; 

Sie können Datensätze gemäß einer bestimmten Spalte (in unserem Beispiel month) in Gruppen aufteilen ). In dieser Situation werden Datensätze als Teil einer Partition eingestuft:

r dr Vorname Nachname Monat verkaufte Produkte
1 1 Maria Jacobs 5 2400
2 2 Lisa Schwarz 5 2300
1 1 Alex Smith 6 2900
2 2 Lisa Schwarz 6 2700
2 2 Maria Jacobs 6 2700
1 1 Maria Jacobs 7 1200
1 1 Lisa Schwarz 7 1200
3 2 Alex Smith 7 1000