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() und DENSE_RANK() bilden Ranglisten mit Gleichständen.
  • Aggregate als Fenster: SUM(), AVG(), COUNT() über OVER ergeben etwa laufende Summen.
  • Zugriff auf Nachbarzeilen: LAG() und LEAD() 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.