Sortierung
Die Unterklausel ORDER BY
kann mit oder ohne Partitionen verwendet werden.Die ORDER BY
-Klausel innerhalb von OVER
gibt die Reihenfolge an, in der die Window-Funktion Zeilen verarbeitet.Diese Reihenfolge muss nicht mit den Auftragszeilen übereinstimmen, die in der Ausgabe erscheinen.
Fensterfunktionen haben ein wichtiges Konzept: Für jede Zeile gibt es eine Reihe von Zeilen in ihrer Partition namens window frame.Standardmäßig besteht der Rahmen bei der Angabe von ORDER BY
aus allen Zeilen vom Anfang der Partition bis zur aktuellen Zeile und Zeilen gleich dem aktuellen ORDER BY
-Ausdruck.Ohne ORDER BY
besteht der Standardrahmen aus allen Zeilen in der Partition.
Daher erzeugt die Klausel ORDER BY
für Standardaggregationsfunktionen bei der Verarbeitung von Zeilen Teilaggregationsergebnisse.
select
id,
salary,
sum(salary) over (order by salary) cumul_salary
from employee
order by salary;
id salary cumul_salary
-- ------ ------------
3 8.00 8.00
4 9.00 17.00
1 10.00 37.00
5 10.00 37.00
2 12.00 49.00
Dann gibt cumul_salary
die partielle/akkumulierte (oder laufende) Aggregation (der SUM
-Funktion) zurück.Es mag seltsam erscheinen, dass 37,00 für die IDs 1 und 5 wiederholt wird, aber so sollte es funktionieren.Die ORDER BY
-Schlüssel werden zusammen gruppiert, und die Aggregation wird einmal berechnet (aber die beiden summieren 10,00).Um dies zu vermeiden, können Sie das Feld "ID" am Ende der Klausel "ORDER BY" hinzufügen.
Es ist möglich, mehrere Windows mit unterschiedlichen Reihenfolgen und ORDER BY
-Teilen wie ASC
/DESC
und NULLS FIRST/LAST
zu verwenden.
Bei einer Partition funktioniert ORDER BY
genauso, aber an jeder Partitionsgrenze wird die Aggregation zurückgesetzt.
Alle Aggregationsfunktionen können ORDER BY
verwenden, außer LIST()
.