Różnicę zobaczysz tylko wtedy, gdy masz powiązania w partycji dla określonej wartości zamówienia.
RANK
i DENSE_RANK
są w tym przypadku deterministyczne, wszystkie wiersze z tą samą wartością dla kolumn porządkowania i partycjonowania kończą się równym wynikiem, podczas gdy ROW_NUMBER
arbitralnie (nie deterministycznie) przypisze wynik inkrementacji do powiązanych wierszy.
Przykład: (Wszystkie wiersze mają ten sam StyleID
więc znajdują się w tej samej partycji i w obrębie tej partycji pierwsze 3 wiersze są powiązane, gdy są uporządkowane według ID
)
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
Zwroty
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
Widać, że dla trzech identycznych wierszy ROW_NUMBER
przyrosty, RANK
wartość pozostaje taka sama, a następnie przeskakuje do 4
. DENSE_RANK
również przypisuje tę samą rangę do wszystkich trzech wierszy, ale następna odrębna wartość otrzymuje wartość 2.