Heim > Datenbank > MySQL-Tutorial > Was ist der Unterschied zwischen RANK() und DENSE_RANK() in Oracle SQL?

Was ist der Unterschied zwischen RANK() und DENSE_RANK() in Oracle SQL?

DDD
Freigeben: 2025-01-25 00:04:14
Original
806 Leute haben es durchsucht

What's the Difference Between RANK() and DENSE_RANK() in Oracle SQL?

Oracle SQL: RANK() und DENSE_RANK() verstehen

In diesem Artikel werden die Hauptunterschiede zwischen den Funktionen RANK() und DENSE_RANK() in Oracle SQL erläutert, wobei der Schwerpunkt auf deren Rangfolgeverhalten liegt, insbesondere beim Umgang mit Bindungen und NULL-Werten.

Hauptunterschiede:

Beide Funktionen weisen Zeilen innerhalb eines Datensatzes basierend auf der angegebenen Reihenfolge Ränge zu. Der entscheidende Unterschied liegt im Umgang mit Bindungen:

  • RANK(): Weist gebundenen Zeilen den gleichen Rang zu, was zu Lücken in der Rangfolge führt. Wenn mehrere Reihen einen Rang teilen, überspringt der nächste Rang die gleichrangigen Ränge. Wenn beispielsweise drei Reihen den zweiten Platz teilen, erhalten sie alle den Rang „2“ und der nächste Rang ist „5“.

  • DENSE_RANK(): Weist aufeinanderfolgende Ränge ohne Lücken zu, auch bei Gleichständen. Es gibt kein Überspringen der Ränge; Die Rangfolge bleibt fortlaufend.

Praktische Anwendung: Das n-thöchste Gehalt finden

Um mit emptbl das n-thöchste Gehalt aus der RANK()-Tabelle abzurufen, könnten Sie eine Abfrage ähnlich dieser verwenden (es gibt jedoch effizientere Methoden):

<code class="language-sql">SELECT empname
FROM (SELECT empname, RANK() OVER (ORDER BY sal DESC) as sal_rank FROM emptbl)
WHERE sal_rank = n;</code>
Nach dem Login kopieren

Dies ordnet die Gehälter in absteigender Reihenfolge und filtert nach der Zeile mit dem gewünschten Rang.

NULL-Wert-Behandlung:

Die Behandlung von NULL-Werten hängt von der ORDER BY-Klausel ab. Wenn NULL-Werte zuerst bestellt werden (ORDER BY sal NULLS FIRST), erhalten sie den niedrigsten Rang. Wenn sie zuletzt bestellt werden (ORDER BY sal NULLS LAST), erhalten sie den höchsten Rang.

Anschauliches Beispiel:

Lassen Sie uns dies anhand von Beispieldaten untersuchen:

<code>DEPTNO  EMPNAME    SAL
------------------------------
10       rrr    10000.00
11       nnn    20000.00
11       mmm    5000.00
12       kkk    30000.00
10       fff    40000.00
10       ddd    40000.00
10       bbb    50000.00
10       ccc    50000.00</code>
Nach dem Login kopieren

Die Abfrage:

<code class="language-sql">SELECT empname, deptno, sal,
       RANK() OVER (PARTITION BY deptno ORDER BY sal NULLS FIRST) as rnk,
       DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal NULLS FIRST) as drnk_first,
       DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal NULLS LAST) as drnk_last
FROM emptbl;</code>
Nach dem Login kopieren

Erzeugt Ergebnisse, die den Unterschied deutlich zeigen: rnk zeigt Rangüberspringen, während drnk_first und drnk_last aufeinanderfolgende Rangfolgen mit unterschiedlicher Behandlung von NULL-Werten zeigen. Die Ausgabetabelle würde die unterschiedlichen Ranking-Verhaltensweisen visuell darstellen. (Hinweis: Im Beispiel wird davon ausgegangen, dass eine Tabelle mit dem Namen emptbl mit den bereitgestellten Daten vorhanden ist; ersetzen Sie sie durch Ihren tatsächlichen Tabellennamen.)

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen RANK() und DENSE_RANK() in Oracle SQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage