Du vil kun se forskellen, hvis du har bindinger inden for en partition for en bestemt bestillingsværdi.
RANK
og DENSE_RANK
er deterministiske i dette tilfælde, vil alle rækker med samme værdi for både rækkefølge- og partitioneringskolonner ende med et ens resultat, mens ROW_NUMBER
vil vilkårligt (ikke deterministisk) tildele et stigende resultat til de bundne rækker.
Eksempel: (Alle rækker har det samme StyleID
så er i den samme partition, og inden for den partition er de første 3 rækker bundet, når de er sorteret efter 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
Returnerer
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
Du kan se, at for de tre identiske rækker ROW_NUMBER
trin, RANK
værdien forbliver den samme, så springer den til 4
. DENSE_RANK
tildeler også den samme rang til alle tre rækker, men den næste distinkte værdi tildeles derefter en værdi på 2.