Window Functions (deutsch: Fensterfunktionen) berechnen Werte über eine Gruppe benachbarter Zeilen, ohne die Zeilen selbst zusammenzufassen. Anders als GROUP BY liefern sie für jede einzelne Zeile ein Ergebnis – dadurch bleiben alle Details sichtbar und zusätzlich entstehen Ranglisten, laufende Summen oder Vorjahresvergleiche.
Aufbau: OVER und PARTITION BY
Eine Fensterfunktion besteht aus der Funktion (etwa ROW_NUMBER(), RANK(), SUM()) und einer OVER-Klausel, die das Fenster definiert:
SELECT name, abteilung, gehalt,
ROW_NUMBER() OVER (PARTITION BY abteilung
ORDER BY gehalt DESC) AS rang
FROM mitarbeiter;
PARTITION BY teilt die Zeilen in Gruppen (Fenster), ORDER BY im Fenster legt die Reihenfolge fest. Ohne PARTITION BY ist das Fenster die gesamte Ergebnismenge.
Wichtige Fensterfunktionen
- Rangfunktionen:
ROW_NUMBER()nummeriert durch,RANK()undDENSE_RANK()bilden Ranglisten mit Gleichständen. - Aggregate als Fenster:
SUM(),AVG(),COUNT()überOVERergeben etwa laufende Summen. - Zugriff auf Nachbarzeilen:
LAG()undLEAD()greifen auf vorherige beziehungsweise folgende Zeilen zu – ideal für Differenzen zwischen Zeitpunkten.
Abgrenzung
Während GROUP BY pro Gruppe genau eine Zeile erzeugt, bleibt bei Fensterfunktionen jede Zeile erhalten. Für eine klassische Gruppierung mit Kennzahlen dient GROUP BY weiterhin; wer eine gefilterte Teilmengenlogik braucht, kombiniert Fensterfunktionen mit einer Subquery oder einer UNION. Views speichern solche Analysen als wiederverwendbare Abfrage – mehr dazu im Artikel View.
MySQL unterstützt Fensterfunktionen seit Version 8.0, MariaDB seit 10.2, SQLite seit 3.25. Die Grundlagen von SELECT zeigen die SQL-Grundlagen.