Was ist eine Fensterfunktion?
Eine Fensterfunktion berechnet einen Wert über mehrere Zeilen und lässt dabei jede Zeile stehen. So steht neben jedem Tag die laufende Summe oder der Rang.
Das ist der Unterschied zu einer Gruppierung, die Zeilen zusammenfasst. Für Berichte mit Verlauf und Rangliste brauchen Sie genau das.
Am Ende dieser Lektion
Notiz
Ich kann neben jede Zeile eine laufende Summe oder einen Rang setzen, ohne Zeilen zu verlieren.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Fensterfunktion | rechnet über mehrere Zeilen und behält jede Zeile | |
| OVER | sagt, dass eine Funktion als Fensterfunktion arbeitet | sum(x) over () |
| Laufende Summe | die Summe aller Werte bis zur aktuellen Zeile | |
| Rang | der Platz einer Zeile in einer Reihenfolge | rank() |
| Fenster | die Zeilen, die eine Funktion für eine Zeile ansieht |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Group by fasst zusammen, over behält die Zeilen
group by macht aus vielen Zeilen eine. Danach ist der einzelne Tag nicht mehr zu sehen.
Eine Fensterfunktion schreibt das Ergebnis dagegen neben jede Zeile. Das Wort over mit einer Klammer macht eine Aggregatfunktion zur Fensterfunktion.
Bleibt die Klammer leer, sieht jede Zeile alle Zeilen.
Die Summe neben jeder Zeile
| tag | fahrten | sum(fahrten) over () |
|---|---|---|
| 2026-05-04 | 42 | 355 |
| 2026-05-05 | 35 | 355 |
| 2026-05-06 | 51 | 355 |
| Weitere vier Tage | ... | 355 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Probieren Sie es: die Summe neben jeder Zeile
-- Neben jedem Tag steht die Summe aller Tage.
select tag, fahrten, sum(fahrten) over () as gesamt
from ausleihen
order by tag;
-- Ersetzen Sie sum durch max und lesen Sie die neue Spalte.
Order by im Fenster macht die Summe laufend
Schreiben Sie order by tag in die Klammer von over. Dann sieht jede Zeile nur noch die Zeilen bis zu sich selbst, in der Reihenfolge der Tage.
So wächst die laufende Summe von Tag zu Tag. Am letzten Tag ist sie so groß wie die Gesamtsumme.
Eine laufende Summe zeigt den Verlauf, etwa die Fahrten seit Wochenbeginn.
Wie die laufende Summe entsteht
| tag | fahrten | laufende_summe | Rechnung |
|---|---|---|---|
| 2026-05-04 | 42 | 42 | 42 |
| 2026-05-05 | 35 | 77 | 42 + 35 |
| 2026-05-06 | 51 | 128 | 42 + 35 + 51 |
| 2026-05-07 | 28 | 156 | 128 + 28 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Probieren Sie es: die laufende Summe
-- Die Summe wächst von Tag zu Tag.
select tag, fahrten,
sum(fahrten) over (order by tag) as laufende_summe
from ausleihen
order by tag;
-- Nennen Sie die Spalte um und nutzen Sie count(*) statt sum(fahrten).
Ein häufiger Fehler
Warnung
Viele glauben, order by in der Klammer von over sortiere das Ergebnis. Es legt nur fest, in welcher Reihenfolge das Fenster rechnet. Für eine sortierte Ausgabe schreiben Sie am Ende der Abfrage ein eigenes order by.
Rank() setzt jede Zeile auf einen Platz
Die Funktion rank() gibt jeder Zeile einen Platz. Wonach, sagt order by in der Klammer.
Mit order by fahrten desc bekommt der Tag mit den meisten Fahrten den Rang 1. Haben zwei Tage gleich viele Fahrten, teilen sie sich den Rang.
Den Rang gibt es neben jeder Zeile, ohne dass ein Tag verschwindet.
Probieren Sie es: der Rang der Tage
-- Rang 1 hat die meisten Fahrten.
select tag, fahrten,
rank() over (order by fahrten desc) as rang
from ausleihen
order by tag;
-- Ändern Sie desc in asc: Wer steht jetzt auf Rang 1?