Ще видите разликата само ако имате връзки в рамките на дял за определена стойност на поръчка.
RANK
и DENSE_RANK
са детерминистични в този случай, всички редове с една и съща стойност както за колоните за подреждане, така и за разделянето ще получат еднакъв резултат, докато ROW_NUMBER
ще присвои произволно (недетерминистично) нарастващ резултат на свързаните редове.
Пример: (Всички редове имат един и същ StyleID
така че са в същия дял и в рамките на този дял първите 3 реда са вързани, когато са подредени по 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
Връща
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
Можете да видите, че за трите еднакви реда ROW_NUMBER
нараства, RANK
стойността остава същата, след което скача до 4
. DENSE_RANK
също така присвоява един и същ ранг и на трите реда, но след това на следващата различна стойност се присвоява стойност 2.