Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL RANK() versus ROW_NUMBER()


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.