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.