Vedrai la differenza solo se hai legami all'interno di una partizione per un valore di ordinazione particolare.
RANK
e DENSE_RANK
sono deterministiche in questo caso, tutte le righe con lo stesso valore per entrambe le colonne di ordinamento e partizionamento finiranno con un risultato uguale, mentre ROW_NUMBER
assegnerà arbitrariamente (non deterministicamente) un risultato incrementale alle righe legate.
Esempio: (Tutte le righe hanno lo stesso StyleID
quindi sono nella stessa partizione e all'interno di quella partizione le prime 3 righe sono legate quando ordinate per 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
Resi
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
Puoi vedere che per le tre righe identiche il ROW_NUMBER
incrementi, il RANK
il valore rimane lo stesso, quindi passa a 4
. DENSE_RANK
assegna anche lo stesso rango a tutte e tre le righe, ma poi al successivo valore distinto viene assegnato un valore di 2.