Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verständnis der Beziehung zwischen Ranking-Funktionen, OVER(), GROUP BY?

Der OVER() -Klausel wird benötigt, damit SQL Server genau weiß, wie Sie Dinge wie RANK() bestimmen möchten . Welcher RANK() erwarten Sie, wenn Sie SQL Server nicht mit einem Sortierkriterium versorgen? Ist der Gewinner eines Rennens derjenige mit der schnellsten Zeit, der langsamsten Zeit oder dem Vornamen in alphabetischer Reihenfolge?

Sie müssen den ORDER BY nicht entfernen -Klausel, wenn Sie ein ORDER BY hinzufügen -Klausel innerhalb von OVER() . Diese werden unabhängig voneinander verwendet - einer, um den RANK() zu bestimmen und die andere, um die Reihenfolge zu diktieren.

Wenn Sie beispielsweise die Finisher eines Rennens zurückgeben möchten, sie aber vom letzten Platz zum ersten Platz ordnen möchten, könnten Sie sagen:

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