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.