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 |