Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL RANK() rispetto a ROW_NUMBER()

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.