🪟 1. Das Geheimnis der Window Functions: Keine Zeilenreduktion!
Ein normales GROUP BY fasst Datensätze zusammen und reduziert Zeilen.
Eine Window Function dagegen berechnet Aggregationen oder Ränge über ein definiertes "Fenster" von Zeilen, erhält aber jede einzelne Detailzeile!
-- Die magische OVER-Klausel:
FUNCTION(...) OVER (
PARTITION BY abteilung -- 1. Fenster aufteilen (wie GROUP BY)
ORDER BY gehalt DESC -- 2. Innerhalb des Fensters sortieren
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -- 3. Fenster-Rahmen (optional)
)
🏆 2. Ranking- & Offset-Funktionen
🔢 Ranking-Funktionen im Vergleich
ROW_NUMBER(): Strikte Durchnummerierung (1, 2, 3, 4)RANK(): Bei Gleichstand gleicher Rang mit Lücke (1, 2, 2, 4)DENSE_RANK(): Bei Gleichstand gleicher Rang ohne Lücke (1, 2, 2, 3)
⏪ LAG & LEAD (Zeitreisen in SQL)
LAG(spalte, 1, 0): Wert der vorherigen Zeile (z.B. Vormonat)LEAD(spalte, 1, 0): Wert der nächsten Zeile (Folgemag)- Ermöglicht Wachstumsberechnungen (MoM / YoY) ohne Self-Joins!
-- Berechne Monat-zu-Monat Umsatzwachstum (MoM Growth)
SELECT
monat,
umsatz,
LAG(umsatz, 1, 0) OVER (ORDER BY monat) AS vormonat_umsatz,
umsatz - LAG(umsatz, 1, 0) OVER (ORDER BY monat) AS delta_absolut,
ROUND((umsatz - LAG(umsatz, 1, umsatz) OVER (ORDER BY monat)) * 100.0 / LAG(umsatz, 1, umsatz) OVER (ORDER BY monat), 2) AS wachstum_prozent
FROM monats_umsatz;
🏭 3. Didaktische Analogie: Das gleitende Fenster
GROUP BY: Du siehst am Ende des Rennens nur die Durchschnittszeit je Altersklasse (1 Zeile pro Gruppe).
Window Function: Jeder Läufer läuft über die Ziellinie (jede Zeile bleibt erhalten), und auf der Anzeigetafel steht: "Du bist aktuell auf Platz 3 deiner Altersklasse und dein Rückstand auf den Läufer vor dir (LAG) beträgt 14 Sekunden."
📑 4. Cheat-Sheet: Window Functions & Frames
| Funktion | Zweck | Typisches Beispiel |
|---|---|---|
ROW_NUMBER() OVER (PARTITION BY k ORDER BY v DESC) |
Eindeutige Zeilennummer je Gruppe | Top-N Produkte je Kategorie ermitteln |
SUM(x) OVER (PARTITION BY k ORDER BY t) |
Fortlaufende kumulierte Summe (Running Total) | Kumulierter Kundenumsatz über Zeit |
AVG(x) OVER (ORDER BY t ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) |
3-Perioden gleitender Durchschnitt (Moving Average) | Glätten von täglichen Aktien- oder Umsatzschwankungen |
LAG(x, 1) OVER (ORDER BY t) |
Zugriff auf vorherigen Zeilenwert | Berechnung von Wachstumsraten und Deltas |
🎯 5. Aufgaben & Checkliste in aufgabe.sql
Öffne die Datei aufgabe.sql und implementiere die 4 Aufgaben: