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

Entendendo a relação entre funções de classificação, OVER(), GROUP BY?


O OVER() cláusula é necessária para que o SQL Server saiba exatamente como você deseja determinar coisas como RANK() . O que RANK() você espera se não fornecer ao SQL Server um critério de ordenação? O vencedor de uma corrida é aquele com o tempo mais rápido, o tempo mais lento ou o primeiro nome em ordem alfabética?

Você não precisa remover o ORDER BY cláusula quando você adiciona um ORDER BY cláusula dentro do OVER() . Estes são usados ​​independentemente - um para determinar o RANK() e o outro para ditar a ordenação.

Então, por exemplo, se você quiser devolver os finalistas de uma corrida, mas ordená-los do último lugar ao primeiro lugar, você pode dizer:
SELECT 
  name, 
  finish_time, 
  [rank] = RANK() OVER (ORDER BY finish_time) -- fastest first
FROM 
  dbo.race_table
ORDER BY 
  finish_time DESC; -- fastest last