Heim > Datenbank > MySQL-Tutorial > SQL RANK() vs. ROW_NUMBER(): Wie unterscheiden sie sich beim Umgang mit gebundenen Zeilen?

SQL RANK() vs. ROW_NUMBER(): Wie unterscheiden sie sich beim Umgang mit gebundenen Zeilen?

Patricia Arquette
Freigeben: 2025-01-13 17:01:42
Original
823 Leute haben es durchsucht

SQL RANK() vs. ROW_NUMBER(): How Do They Differ When Handling Tied Rows?

Unterschiede zwischen SQL RANK() und ROW_NUMBER()

Der Unterschied zwischen den Funktionen RANK() und ROW_NUMBER() in SQL verwirrt Entwickler oft. Auch wenn die bereitgestellten SQL-Abfrageanweisungen zunächst scheinbar die gleichen Ergebnisse liefern, werden sie bei identischen Werten unterschiedlich ausgeführt.

Tauchen Sie ein in die Unterschiede

Der Hauptunterschied zwischen den Funktionen RANK() und ROW_NUMBER() besteht darin, wie sie identische Werte verarbeiten. RANK() und die entsprechende Funktion DENSE_RANK() weisen deterministisches Verhalten auf. Wenn mehrere Zeilen in den Partitionierungs- und Sortierspalten denselben Wert haben, wird ihnen derselbe Rang zugewiesen.

Im Gegensatz dazu weist ROW_NUMBER() steigende Ergebniswerte auch für Zeilen mit demselben Wert zu. Dieses Verhalten ist nicht deterministisch, was bedeutet, dass sich die Reihenfolge identischer Zeilen in der Ergebnismenge beliebig ändern kann.

Beispielbeschreibung

Stellen Sie sich das folgende Szenario vor: Alle Zeilen haben dieselbe StyleID und bilden eine Partition. Innerhalb dieser Partition sind die ersten drei Zeilen gleichwertig, wenn sie nach ID sortiert werden.

<code class="language-sql">WITH T(StyleID, ID)
AS (SELECT 1,1 UNION ALL
    SELECT 1,1 UNION ALL
    SELECT 1,1 UNION ALL
    SELECT 1,2)
SELECT *,
    RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS [RANK],
    ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS [ROW_NUMBER],
    DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS [DENSE_RANK]
FROM T</code>
Nach dem Login kopieren

Die Ergebnisausgabe sieht wie folgt aus:

<code>StyleID     ID       RANK      ROW_NUMBER      DENSE_RANK
----------- -------- --------- --------------- ----------
1           1        1         1               1
1           1        1         2               1
1           1        1         3               1
1           2        4         4               2</code>
Nach dem Login kopieren

Wie Sie sehen können, weist ROW_NUMBER() identischen Zeilen inkrementell numerische Werte zu, während RANK() und DENSE_RANK() allen drei identischen Zeilen denselben Rang zuweisen. DENSE_RANK() verhält sich wie RANK(), weist jedoch nachfolgenden Zeilen den nächst unterschiedlichen Wert 2 zu, um Lücken in der Rangfolge zu vermeiden.

Das obige ist der detaillierte Inhalt vonSQL RANK() vs. ROW_NUMBER(): Wie unterscheiden sie sich beim Umgang mit gebundenen Zeilen?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage