Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL RANK() im Vergleich zu ROW_NUMBER()

Sie werden den Unterschied nur sehen, wenn Sie Bindungen innerhalb einer Partition für einen bestimmten Bestellwert haben.

RANK und DENSE_RANK in diesem Fall deterministisch sind, werden alle Zeilen mit demselben Wert sowohl für die Sortier- als auch für die Partitionierungsspalte zu einem gleichen Ergebnis führen, wohingegen ROW_NUMBER weist den verknüpften Zeilen willkürlich (nicht deterministisch) ein inkrementierendes Ergebnis zu.

Beispiel: (Alle Zeilen haben dieselbe StyleID befinden sich also in derselben Partition und innerhalb dieser Partition sind die ersten 3 Zeilen gebunden, wenn sie nach ID geordnet sind )

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  

Rückgabe

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

Sie sehen das für die drei identischen Zeilen die ROW_NUMBER Inkremente, der RANK Wert bleibt gleich, dann springt er auf 4 . DENSE_RANK weist auch allen drei Zeilen den gleichen Rang zu, aber dann wird dem nächsten eindeutigen Wert der Wert 2 zugewiesen.