Du kommer bara att se skillnaden om du har kopplingar inom en partition för ett visst beställningsvärde.
RANK
och DENSE_RANK
är deterministiska i det här fallet kommer alla rader med samma värde för både beställnings- och partitioneringskolumnen att få ett lika stort resultat, medan ROW_NUMBER
kommer godtyckligt (icke deterministiskt) att tilldela ett ökande resultat till de bundna raderna.
Exempel: (Alla rader har samma StyleID
så är i samma partition och inom den partitionen är de första 3 raderna kopplade när de sorteras 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
Retur
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 att för de tre identiska raderna ROW_NUMBER
stegar, RANK
värdet förblir detsamma och sedan hoppar det till 4
. DENSE_RANK
tilldelar också samma rang till alla tre raderna men sedan tilldelas nästa distinkta värde värdet 2.