Je zult het verschil alleen zien als je banden binnen een partitie hebt voor een bepaalde bestelwaarde.
RANK
en DENSE_RANK
zijn in dit geval deterministisch, alle rijen met dezelfde waarde voor zowel de volgorde- als de partitioneringskolom zullen een gelijk resultaat opleveren, terwijl ROW_NUMBER
zal willekeurig (niet deterministisch) een oplopend resultaat toewijzen aan de gebonden rijen.
Voorbeeld: (Alle rijen hebben dezelfde StyleID
dus zijn in dezelfde partitie en binnen die partitie zijn de eerste 3 rijen gebonden wanneer besteld door 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
Retourneren
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
Je kunt zien dat voor de drie identieke rijen de ROW_NUMBER
stappen, de RANK
waarde blijft hetzelfde en springt naar 4
. DENSE_RANK
kent ook dezelfde rangorde toe aan alle drie de rijen, maar dan krijgt de volgende afzonderlijke waarde een waarde van 2.