Você só verá a diferença se tiver ligações dentro de uma partição para um valor de pedido específico.
RANK
e DENSE_RANK
são determinísticas neste caso, todas as linhas com o mesmo valor para as colunas de ordenação e particionamento terminarão com um resultado igual, enquanto ROW_NUMBER
irá arbitrariamente (não deterministicamente) atribuir um resultado de incremento às linhas empatadas. Exemplo: (Todas as linhas têm o mesmo
StyleID
então estão na mesma partição e dentro dessa partição as primeiras 3 linhas estão empatadas quando ordenadas por 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
Devoluções
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
Você pode ver que para as três linhas idênticas o
ROW_NUMBER
incrementos, o RANK
o valor permanece o mesmo, então ele salta para 4
. DENSE_RANK
também atribui a mesma classificação a todas as três linhas, mas o próximo valor distinto recebe um valor de 2.