Ähnlich wie die RANK-Funktion liefert DENSE_RANK den Rang des Wertes in der aktuellen Zeile im Vergleich zu den Werten in anderen Zeilen. Der Rang eines Wertes reflektiert die Reihenfolge, in der er in der Liste erscheinen würde, wenn die Werte sortiert wären. Der Rang wird für den Ausdruck berechnet, der in der ORDER BY-Klausel des Fensters festgelegt wurde.
Die Funktion DENSE_RANK liefert eine Reihe von Rangfolgen, die gleichmäßig und ohne Lücken oder Sprünge beim Rangwert ansteigen. Die Bezeichnung "dense" (= dicht) wird benutzt, da es anders als bei der RANK-Funktion keine Sprünge beim Rangwert gibt.
Wenn sich das Fenster durch die Eingabezeilen nach unten bewegt, wird der Rang für den Ausdruck berechnet, der in der ORDER BY-Klausel des Fensters angegeben wurde. Falls die ORDER BY-Klausel mehrere Ausdrücke enthält, werden der zweite und die folgenden Ausdrücke benutzt, um Gleichwertigkeiten aufzulösen, falls der erste Ausdruck den gleichen Wert in angrenzenden Zeilen ergibt. NULL steht vor allen anderen Werten (bei aufsteigender Sortierfolge).
Die folgende Abfrage ermittelt die drei teuersten Produkte in der Datenbank. Für das Fenster wird eine absteigende Sortierfolge festgelegt, sodass das teuerste Produkt den niedrigsten Rang hat. Die Rangfolgen beginnen mit 1.
SELECT Top 3 * FROM ( SELECT Description, Quantity, UnitPrice, DENSE_RANK( ) OVER ( ORDER BY UnitPrice DESC ) AS Rank FROM Products ) AS DT ORDER BY Rank; |
Diese Abfrage liefert das folgende Ergebnis:
Description | Quantity | UnitPrice | Rank | |
---|---|---|---|---|
1 | Hooded Sweatshirt | 39 | 24.00 | 1 |
2 | Zipped Sweatshirt | 32 | 24.00 | 1 |
3 | Cotton Shorts | 80 | 15.00 | 2 |
Beachten Sie, dass die Zeilen 1 und 2 den gleichen Wert für "Unit Price" und daher auch den gleichen Rang haben. Dies wird als Gleichwertigkeit bezeichnet.
Mit der Funktion DENSE_RANK gibt es nach einer Gleichwertigkeit keinen Sprung beim Rangwert. Der Rangwert für Zeile 3 beträgt zum Beispiel 2. Dies ist unterschiedlich zur RANK-Funktion, bei der nach einer Gleichwertigkeit ein Sprung in den Rangwerten auftritt. Siehe RANK-Funktion.
Da Fenster nach der GROUP BY-Klausel einer Abfrage ausgewertet werden, können Sie komplexe Kriterien festlegen, welche die Rangfolgen aufgrund der Werte einer Aggregatfunktion ermitteln.
Die folgende Abfrage liefert die drei Spitzenverkäufer jeder Region nach ihrem Gesamtumsatz zusammen mit dem Gesamtumsatz für jede einzelne Region:
SELECT * FROM ( SELECT o.SalesRepresentative, o.Region, SUM( s.Quantity * p.UnitPrice ) AS total_sales, DENSE_RANK( ) OVER ( PARTITION BY o.Region, GROUPING( o.SalesRepresentative ) ORDER BY total_sales DESC ) AS sales_rank FROM Products p, SalesOrderItems s, SalesOrders o WHERE p.ID = s.ProductID AND s.ID = o.ID GROUP BY GROUPING SETS( ( o.SalesRepresentative, o.Region ), o.Region ) ) AS DT WHERE sales_rank <= 3 ORDER BY Region, sales_rank; |
Diese Abfrage liefert das folgende Ergebnis:
SalesRepresentative | Region | total_sales | sales_rank | |
---|---|---|---|---|
1 | 299 | Canada | 9312.00 | 1 |
2 | (NULL) | Canada | 24768.00 | 1 |
3 | 1596 | Canada | 3564.00 | 2 |
4 | 856 | Canada | 2724.00 | 3 |
5 | 299 | Central | 32592.00 | 1 |
6 | (NULL) | Central | 134568.00 | 1 |
7 | 856 | Central | 14652.00 | 2 |
8 | 467 | Central | 14352.00 | 3 |
9 | 299 | Eastern | 21678.00 | 1 |
10 | (NULL) | Eastern | 142038.00 | 1 |
11 | 902 | Eastern | 15096.00 | 2 |
12 | 690 | Eastern | 14808.00 | 3 |
13 | 1142 | South | 6912.00 | 1 |
14 | (NULL) | South | 45262.00 | 1 |
15 | 667 | South | 6480.00 | 2 |
16 | 949 | South | 5782.00 | 3 |
17 | 299 | Western | 5640.00 | 1 |
18 | (NULL) | Western | 37632.00 | 1 |
19 | 1596 | Western | 5076.00 | 2 |
20 | 667 | Western | 4068.00 | 3 |
Hier werden mehrere Gruppierungen durch die Verwendung von GROUPING SETS kombiniert. Daher verwendet die WINDOW PARTITION-Klausel für das Fenster die GROUPING-Funktion, um zwischen Detailzeilen, die bestimmte Verkäufer repräsentieren, und Zwischensummenzeilen, in denen der Gesamtumsatz für eine Region aufgeführt wird, zu unterscheiden. Die Zwischensummenzeilen nach Region, die für das Attribut "SalesRepresentative" den Wert NULL enthalten, haben alle den Rangwert 1, da die Rangfolge des Ergebnisses für jede Partition der Eingabe neu gestartet wird. Damit wird gewährleistet, dass die Detailzeilen korrekt mit dem Rangwert 1 beginnen.
Beachten Sie außerdem, dass die Funktion DENSE_RANK in diesem Beispiel die Rangfolge der Eingabe über die Aggregation des Gesamtumsatzes berechnet. Ein Element mit Alias in der Auswahlliste wird als Abkürzung in der WINDOW ORDER-Klausel benutzt.
Weitere Hinweise zur Syntax der DENSE_RANK-Funktion finden Sie unter DENSE_RANK-Funktion [Rangfolge].
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |