Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Daten abfragen und ändern » OLAP-Unterstützung » Fensterfunktionen in SQL Anywhere » Fenster-Rangfunktionen

 

DENSE_RANK-Funktion

Ä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).

Beispiel 1

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. Weitere Hinweise finden Sie unter RANK-Funktion.

Beispiel 2

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].