Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
DENSE_ RANK Fenster-Funktion
Die RANK Fensterfunktion DENSE _ bestimmt den Rang eines Werts in einer Gruppe von Werten auf der Grundlage des ORDER BY-Ausdrucks in der OVER Klausel. Wenn die optionale PARTITION BY-Klausel vorhanden ist, werden die Ranglisten für jede Zeilengruppe zurückgesetzt. Zeilen mit gleichen Werten in Bezug auf die Rangfestlegungskriterien erhalten den gleichen Rang. Die RANK Funktion DENSE _ unterscheidet sich RANK in einem Punkt von: Wenn zwei oder mehr Zeilen identisch sind, gibt es keine Lücke in der Reihenfolge der Rangwerte. Wenn beispielsweise zwei Zeilen den Rang 1
erhalten, ist der nächste Rang 2
.
Sie können Rankingfunktionen mit unterschiedlichen PARTITION ORDER BY- und BY-Klauseln in derselben Abfrage haben.
Syntax
DENSE_RANK() OVER ( [ PARTITION BY expr_list ] [ ORDER BY order_list ] )
Argumente
- ( )
-
Die Funktion verwendet keine Argumente. Es ist jedoch eine leere Klammer erforderlich.
- OVER
-
Die Fensterklauseln für die Funktion DENSE _RANK.
- PARTITIONVON expr_list
-
(Optional) Ein oder mehrere Ausdrücke, der/die das Fenster definiert/definieren.
- ORDERVON order_list
-
(Optional) Der Ausdruck, auf dem die Rangfestlegungwerte basieren. Wenn kein PARTITION BY angegeben ist, verwendet ORDER BY die gesamte Tabelle. Wenn ORDER BY weggelassen wird, gilt der Rückgabewert
1
für alle Zeilen.Wenn ORDER BY keine eindeutige Reihenfolge erzeugt, ist die Reihenfolge der Zeilen nicht deterministisch. Weitere Informationen finden Sie unter Spezifisches Anordnen von Daten für Fensterfunktionen.
Rückgabetyp
INTEGER
Beispiele
Die folgenden Beispiele verwenden die Beispieltabelle für Fensterfunktionen. Weitere Informationen finden Sie unter Beispieltabelle mit Beispielen von Fensterfunktionen.
Im folgenden Beispiel wird die Tabelle nach der verkauften Menge geordnet und jeder Zeile ein DENSE_RANK-Wert und ein regulärer Rang zugewiesen. Die Ergebnisse werden sortiert, nachdem die Fensterfunktionsergebnisse angewendet wurden.
SELECT salesid, qty, DENSE_RANK() OVER(ORDER BY qty DESC) AS d_rnk, RANK() OVER(ORDER BY qty DESC) AS rnk FROM winsales ORDER BY 2,1;
+---------+-----+-------+-----+ | salesid | qty | d_rnk | rnk | +---------+-----+-------+-----+ | 10001 | 10 | 5 | 8 | | 10006 | 10 | 5 | 8 | | 30001 | 10 | 5 | 8 | | 40005 | 10 | 5 | 8 | | 30003 | 15 | 4 | 7 | | 20001 | 20 | 3 | 4 | | 20002 | 20 | 3 | 4 | | 30004 | 20 | 3 | 4 | | 10005 | 30 | 2 | 2 | | 30007 | 30 | 2 | 2 | | 40001 | 40 | 1 | 1 | +---------+-----+-------+-----+
Beachten Sie den Unterschied in der Rangfolge, die derselben Gruppe von Zeilen zugewiesen werden, wenn die RANK Funktionen DENSE _ RANK und die Funktionen in derselben Abfrage nebeneinander verwendet werden.
Im folgenden Beispiel wird die Tabelle nach sellerid partitioniert, die einzelnen Partitionen nach der Menge geordnet und jeder Zeile ein Dichtewert zugewiesen. Die Ergebnisse werden sortiert, nachdem die Fensterfunktionsergebnisse angewendet wurden.
SELECT salesid, sellerid, qty, DENSE_RANK() OVER(PARTITION BY sellerid ORDER BY qty DESC) AS d_rnk FROM winsales ORDER BY 2,3,1;
+---------+----------+-----+-------+ | salesid | sellerid | qty | d_rnk | +---------+----------+-----+-------+ | 10001 | 1 | 10 | 2 | | 10006 | 1 | 10 | 2 | | 10005 | 1 | 30 | 1 | | 20001 | 2 | 20 | 1 | | 20002 | 2 | 20 | 1 | | 30001 | 3 | 10 | 4 | | 30003 | 3 | 15 | 3 | | 30004 | 3 | 20 | 2 | | 30007 | 3 | 30 | 1 | | 40005 | 4 | 10 | 2 | | 40001 | 4 | 40 | 1 | +---------+----------+-----+-------+
Um das letzte Beispiel erfolgreich zu verwenden, verwenden Sie den folgenden Befehl, um eine Zeile in die WINSALES Tabelle einzufügen. Diese Zeile hat dieselbe buyerid, sellerid und qtysold wie eine andere Zeile. Dadurch werden im letzten Beispiel zwei Zeilen miteinander verknüpft, was den Unterschied zwischen den RANK Funktionen DENSE _ RANK und zeigt.
INSERT INTO winsales VALUES(30009, '2/2/2003', 3, 'b', 20, NULL);
Im folgenden Beispiel wird die Tabelle nach buyerid und sellerid partitioniert, die einzelnen Partitionen nach der Menge geordnet und jeder Zeile wird ein Dichtewert und ein regulärer Rang zugewiesen. Die Ergebnisse werden sortiert, nachdem die Fensterfunktion angewendet wurde.
SELECT salesid, sellerid, qty, buyerid, DENSE_RANK() OVER(PARTITION BY buyerid, sellerid ORDER BY qty DESC) AS d_rnk, RANK() OVER (PARTITION BY buyerid, sellerid ORDER BY qty DESC) AS rnk FROM winsales ORDER BY rnk;
+---------+----------+-----+---------+-------+-----+ | salesid | sellerid | qty | buyerid | d_rnk | rnk | +---------+----------+-----+---------+-------+-----+ | 20001 | 2 | 20 | b | 1 | 1 | | 30007 | 3 | 30 | c | 1 | 1 | | 10006 | 1 | 10 | c | 1 | 1 | | 10005 | 1 | 30 | a | 1 | 1 | | 20002 | 2 | 20 | c | 1 | 1 | | 30009 | 3 | 20 | b | 1 | 1 | | 40001 | 4 | 40 | a | 1 | 1 | | 30004 | 3 | 20 | b | 1 | 1 | | 10001 | 1 | 10 | c | 1 | 1 | | 40005 | 4 | 10 | a | 2 | 2 | | 30003 | 3 | 15 | b | 2 | 3 | | 30001 | 3 | 10 | b | 3 | 4 | +---------+----------+-----+---------+-------+-----+