Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comprendre la relation entre les fonctions de classement, OVER(), GROUP BY ?

Le OVER() La clause est nécessaire pour que SQL Server sache exactement comment vous voulez déterminer des choses comme RANK() . Quel RANK() attendez-vous si vous ne fournissez pas à SQL Server un critère de commande ? Le vainqueur d'une course est-il celui qui a réalisé le temps le plus rapide, le temps le plus lent ou le prénom par ordre alphabétique ?

Vous n'avez pas besoin de supprimer le ORDER BY clause lorsque vous ajoutez un ORDER BY clause à l'intérieur de OVER() . Ceux-ci sont utilisés indépendamment - un pour déterminer le RANK() et l'autre pour dicter la commande.

Ainsi, par exemple, si vous vouliez ramener les finissants d'une course, mais les classer de la dernière place à la première place, vous pourriez dire :

SELECT 
  name, 
  finish_time, 
  [rank] = RANK() OVER (ORDER BY finish_time) -- fastest first
FROM 
  dbo.race_table
ORDER BY 
  finish_time DESC; -- fastest last