sql >> Base de Datos >  >> RDS >> Sqlserver

SQL RANK() frente a ROW_NUMBER()

Solo verá la diferencia si tiene vínculos dentro de una partición para un valor de pedido en particular.

RANK y DENSE_RANK son deterministas en este caso, todas las filas con el mismo valor para las columnas de ordenación y partición terminarán con un resultado igual, mientras que ROW_NUMBER asignará arbitrariamente (no determinísticamente) un resultado incremental a las filas empatadas.

Ejemplo: (Todas las filas tienen el mismo StyleID por lo tanto, están en la misma partición y dentro de esa partición, las primeras 3 filas están vinculadas cuando se ordenan por 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  

Devoluciones

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

Puede ver que para las tres filas idénticas el ROW_NUMBER incrementos, el RANK el valor permanece igual y luego salta a 4 . DENSE_RANK también asigna el mismo rango a las tres filas, pero luego al siguiente valor distinto se le asigna un valor de 2.