⚡ Lehrpfad 3: Aggregationen, CTEs & Window Functions

SQL 12: Window Functions (OVER, PARTITION BY, RANK, LAG)

Moderne SQL-Analytik ohne Zeilenreduktion: Berechne Rangfolgen (ROW_NUMBER, RANK, DENSE_RANK), Zeitreihen-Deltas mit LAG/LEAD und fortlaufende Summen (Running Totals).

📂 Dateien dieser Lerneinheit:
📄 aufgabe.sql (Startercode) 🧪 test_aufgabe.sql (Testsuite) 💡 musterloesung.sql (Lösung) 📖 README.md

🪟 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

🏃‍♂️ Der Marathon-Lauf-Vergleich

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:

💻 In Web-IDE öffnen & lösen →