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>
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>
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!