Unterschiede zwischen SQL RANK() und ROW_NUMBER()
Bei der Verwendung von SQL-Ranking-Funktionen ist es wichtig, den Unterschied zwischen RANK() und ROW_NUMBER() zu verstehen. Obwohl sie in manchen Fällen ähnlich aussehen, können sie sich beim Umgang mit doppelten Werten unterschiedlich verhalten.
Vergleich von ROW_NUMBER() und RANK()
ROW_NUMBER() weist jeder Zeile einen fortlaufenden ganzzahligen Wert zu, unabhängig davon, ob die Werte in der Sortierspalte gleich sind. Das bedeutet, dass ROW_NUMBER() jeder Zeile immer eine eindeutige Ganzzahl zuweist.
RANK() hingegen weist jeder Zeile einen Rang zu, basierend auf der Sortierreihenfolge der Zeile innerhalb der Partition. Zeilen mit demselben Sortierwert erhalten denselben Rang. Bei einem Gleichstand entstehen Lücken in der Rangliste.
Demo
Die folgende SQL-Abfrage zeigt den Unterschied zwischen ROW_NUMBER() und RANK():
<code class="language-sql">SELECT ID, [Description], RANK() OVER(PARTITION BY StyleID ORDER BY ID) as 'Rank' FROM SubStyle</code>
<code class="language-sql">SELECT ID, [Description], ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) as 'RowNumber' FROM SubStyle</code>
Mit diesen Abfragen sehen beide Ergebnismengen zunächst identisch aus. Gibt es jedoch einen Gleichstand in der Rangliste, wird der Unterschied deutlich. Betrachten Sie die folgenden Beispieldaten:
<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>
Ergebnis:
<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>
In diesem Beispiel erhöht sich ROW_NUMBER() auch bei Gleichstand, während RANK() allen gebundenen Zeilen den gleichen Rang zuweist. DENSE_RANK() ist wie RANK(), weist jedoch den nächstverschiedenen Rang (2) dem nächstverschiedenen Rangwert zu.
Das obige ist der detaillierte Inhalt vonSQL RANK() vs. ROW_NUMBER(): Was ist der Unterschied?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!