ROW_NUMBER ·
RANK ·
DENSE_RANK ·
LAG ·
LEAD ·
NTILE
Window Functions ermöglichen Berechnungen über eine Gruppe von Zeilen, ohne die Zeilen zu einer einzigen Ausgabe zu aggregieren. Sie sind unverzichtbar für Ranglisten, Zeitreihenanalysen und komplexe Berichte.
ROW_NUMBER weist jeder Zeile eine eindeutige, fortlaufende Nummer innerhalb ihrer Partition zu. Die Reihenfolge wird durch ORDER BY bestimmt.
ROW_NUMBER ist ideal für Paginierung innerhalb von Gruppen (z.B. "Top 3 pro Kategorie") oder für das Entfernen von Duplikaten in Kombination mit WHERE rn = 1.
RANK und DENSE_RANK erstellen Ranglisten. Bei gleichen Werten (Bindungen) erhalten sie den gleichen Rang. RANK überspringt Ränge, DENSE_RANK nicht.
| Wert | ROW_NUMBER | RANK | DENSE_RANK |
|---|---|---|---|
| 100 | 1 | 1 | 1 |
| 100 | 2 | 1 | 1 |
| 90 | 3 | 3 | 2 |
| 80 | 4 | 4 | 3 |
RANK für Wettbewerbe ("1. Platz, 2. Platz"), wenn bei Gleichstand mehrere den gleichen Rang erhalten. Verwenden Sie DENSE_RANK, wenn Sie lückenlose Ränge wünschen.
LAG greift auf Werte aus vorherigen Zeilen zu, LEAD auf Werte aus folgenden Zeilen. Ideal für Zeitreihenanalysen und Differenzberechnungen.
LAG und LEAD sind unverzichtbar für Zeitreihenanalysen, Trends und Vergleichsberechnungen (z.B. "Umsatz im Vergleich zum Vormonat").
NTILE teilt die Ergebnismenge in eine bestimmte Anzahl von Gruppen (Töpfen) auf. Jede Gruppe erhält eine Nummer von 1 bis n. Ideal für Perzentile und Quintile.
NTILE ist ideal für die Einteilung in Leistungsklassen, Preissegmente oder für statistische Analysen wie Quartilsberechnungen.
PARTITION BY teilt die Daten in logische Gruppen (Partitionen) auf. Die Window Function wird separat für jede Partition berechnet – wie ein "GROUP BY" ohne Zusammenfassung.
PARTITION BY ist besonders nützlich für "Top-N pro Gruppe"-Abfragen oder für Vergleiche innerhalb von Gruppen (z.B. Umsatz pro Kategorie im Vergleich zum Vormonat).
Frame-Spezifikation definiert, welche Zeilen in der Berechnung der Window Function berücksichtigt werden – z.B. für gleitende Durchschnitte oder kumulative Summen.
| Option | Beschreibung |
|---|---|
| ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW | Kumulative Summe (Standard für ORDER BY ohne Frame) |
| ROWS BETWEEN n PRECEDING AND n FOLLOWING | Gleitender Durchschnitt über n Zeilen vor und nach der aktuellen |
| ROWS BETWEEN n PRECEDING AND CURRENT ROW | Laufender Durchschnitt über die letzten n Zeilen |
| ROWS UNBOUNDED PRECEDING | Alle vorherigen Zeilen (kumulativ) |
| RANGE BETWEEN INTERVAL '7' DAY PRECEDING AND CURRENT ROW | Letzte 7 Tage (PostgreSQL) |
ROWS und RANGE, um die gewünschte Fenstergröße zu erreichen.
ROW_NUMBER
RANK
LAG/LEAD
NTILE
PARTITION BY
ROWS
ROW_NUMBER() OVER (PARTITION BY kategorie ORDER BY preis DESC) ·
LAG(umsatz, 1) OVER (ORDER BY datum)