Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL RANK() contre ROW_NUMBER()

Vous ne verrez la différence que si vous avez des liens au sein d'une partition pour une valeur de commande particulière.

RANK et DENSE_RANK sont déterministes dans ce cas, toutes les lignes avec la même valeur pour les colonnes de tri et de partition se retrouveront avec un résultat égal, alors que ROW_NUMBER attribuera arbitrairement (de manière non déterministe) un résultat incrémenté aux lignes liées.

Exemple : (Toutes les lignes ont le même StyleID sont donc dans la même partition et dans cette partition, les 3 premières lignes sont liées lorsqu'elles sont classées par 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  

Retours

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

Vous pouvez voir que pour les trois lignes identiques, le ROW_NUMBER incréments, le RANK la valeur reste la même puis elle saute à 4 . DENSE_RANK attribue également le même rang aux trois lignes, mais la valeur distincte suivante se voit attribuer la valeur 2.