oracle rank () und dense_rank (): Eine vergleichende Analyse der Fensterfunktionen
Oracle's RANK()
und DENSE_RANK()
sind Fensterfunktionen, mit denen Ränge in einer angegebenen Partition Zeilen zugewiesen werden. Während beide ähnliche Ziele erreichen, unterscheidet sich ihr Umgang mit Krawatten und Nullwerten erheblich.
RANK()
Funktion
RANK()
Zugewiesen Ränge basierend auf der angegebenen Bestellung. Entscheidend ist, dass es den gleichen -Rank für gebundene Zeilen zuweist und dann Ränge überspringt. Wenn beispielsweise drei Zeilen für den zweiten Platz gebunden sind, erhalten sie alle einen Rang von 2 und der nächste Rang ist 5.
DENSE_RANK()
Funktion
Im Gegensatz zu RANK()
weist DENSE_RANK()
aufeinanderfolgende Ränge ohne Lücken, auch mit Bindungen zu. Alle gebundenen Zeilen erhalten den gleichen Rang, und der nachfolgende Rang folgt unmittelbar. Es gibt keine übersprungenen Ränge.
das n. Höchste Gehalt
abrufen Um das n. Höchste Gehalt aus der Tabelle emptbl
zu identifizieren, können Sie entweder RANK()
oder DENSE_RANK()
innerhalb der OVER()
-Klausel verwenden:
<code class="language-sql">SELECT empname, sal FROM ( SELECT empname, sal, RANK() OVER (ORDER BY sal DESC) AS rnk -- Note: ORDER BY sal DESC for nth highest FROM emptbl ) WHERE rnk = n;</code>
null -Werte
Die Behandlung von Nullwerten nach beiden Funktionen wird durch die ORDER BY
-Klausel bestimmt. Wenn NULLS FIRST
angegeben ist, werden Nulls vor Nicht-Null-Werten eingestuft; Wenn NULLS LAST
, werden sie nach.
Illustratives Beispiel
untersuchen wir das folgende Skript:
<code class="language-sql">WITH q AS ( SELECT 10 AS DEPTNO, 'rrr' AS EMPNAME, 10000.00 AS SAL FROM DUAL UNION ALL SELECT 11, 'nnn', 20000.00 FROM DUAL UNION ALL SELECT 11, 'mmm', 5000.00 FROM DUAL UNION ALL SELECT 12, 'kkk', 30000 FROM DUAL UNION ALL SELECT 10, 'fff', 40000 FROM DUAL UNION ALL SELECT 10, 'ddd', 40000 FROM DUAL UNION ALL SELECT 10, 'bbb', 50000 FROM DUAL UNION ALL SELECT 10, 'xxx', NULL FROM DUAL UNION ALL SELECT 10, 'ccc', 50000 FROM DUAL ) SELECT EMPNAME, DEPTNO, SAL, RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL NULLS FIRST) AS R, DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL NULLS FIRST) AS DR1, DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL NULLS LAST) AS DR2 FROM q;</code>
und RANK()
beim Umgang mit Nullwerten, abhängig von der DENSE_RANK()
oder NULLS FIRST
-Pezifikation in der NULLS LAST
-Anklausel. In diesem Beispiel wird hervorgehoben, wie wichtig es ist, diese Nuancen bei der Auswahl der entsprechenden Ranking -Funktion für Ihre spezifischen Anforderungen zu verstehen. ORDER BY
Das obige ist der detaillierte Inhalt vonRANK() vs. DENSE_RANK() in Oracle: Wie unterscheiden sich diese Fensterfunktionen in der Rangfolge und der Handhabung von Nullen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!