Auf den ersten Blick wirken Window-Funktionen und Aggregatfunktionen wie ähnliche Tools zum Analysieren und Bearbeiten von Daten. Beide machen Berechnungen wie Summe, Durchschnitt, Ranking usw. Aber lass uns mal schauen, worin sie sich im Kern unterscheiden.
Aggregatfunktionen (GROUP BY)
Aggregatfunktionen funktionieren so:
- Sie gruppieren Zeilen nach den angegebenen Spalten.
- Nach dem Gruppieren wird jede Gruppe zu genau einer Ergebniszeile.
- Beispiel: Du willst den Gesamtumsatz pro Region wissen.
SELECT region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY region;
Besonderheit: GROUP BY "komprimiert" die Daten. Wenn du gruppierst, verschwinden alle Zeilen einer Gruppe – übrig bleibt nur das Aggregationsergebnis.
Window-Funktionen (PARTITION BY)
Window-Funktionen dagegen:
- Erhalten die ursprüngliche Datenstruktur (keine Komprimierung oder Zeilen, die verschwinden!).
- Können Berechnungen innerhalb von "Fenstern" machen – logisch abgegrenzte Gruppen von Zeilen.
Beispiel: Du willst den Anteil der Verkäufe jeder Stadt am Gesamtumsatz ihrer Region wissen, aber alle Daten behalten.
SELECT
region,
city,
sales,
SUM(sales) OVER (PARTITION BY region) AS total_sales_by_region
FROM sales_data;
Besonderheit: Window-Funktionen löschen keine Zeilen, sondern fügen jeder Zeile einfach neue berechnete Werte hinzu.
Beispiel: SUM() mit GROUP BY vs SUM() mit PARTITION BY
Um den Unterschied besser zu checken, schauen wir uns an, wie SUM() in beiden Fällen funktioniert. Stell dir vor, wir haben eine Tabelle sales_data wie folgt:
| region | city | sales |
|---|---|---|
| North | CityA | 100 |
| North | CityB | 150 |
| South | CityC | 200 |
| South | CityD | 250 |
Summieren mit GROUP BY
Wir wollen den Gesamtumsatz pro Region wissen:
SELECT region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY region;
Das Ergebnis sieht so aus:
| region | total_sales |
|---|---|
| North | 250 |
| South | 450 |
Was passiert ist: Die Zeilen wurden nach region gruppiert und jede Gruppe wurde zu einer Zeile mit der Verkaufssumme "komprimiert".
Summieren mit PARTITION BY
Jetzt machen wir das Gleiche mit einer Window-Funktion:
SELECT
region,
city,
sales,
SUM(sales) OVER (PARTITION BY region) AS total_sales_by_region
FROM sales_data;
Ergebnis:
| region | city | sales | total_sales_by_region |
|---|---|---|---|
| North | CityA | 100 | 250 |
| North | CityB | 150 | 250 |
| South | CityC | 200 | 450 |
| South | CityD | 250 | 450 |
Was passiert ist: PARTITION BY hat die Zeilen nicht "komprimiert". Stattdessen wurde die Summe innerhalb bestimmter Fenster berechnet (jede Region ist ein eigenes Fenster).
Wann benutzt man GROUP BY und wann PARTITION BY?
GROUP BY: perfekt für finale Reports
GROUP BY ist praktisch, wenn du die Datenmenge reduzieren und Gruppenergebnisse bekommen willst. Zum Beispiel:
- Gesamtverkäufe pro Monat.
- Anzahl der Bestellungen pro Produktkategorie.
Beispiel:
SELECT category, COUNT(*) AS total_orders
FROM orders
GROUP BY category;
PARTITION BY: ideal für Analyse und Detailauswertung
PARTITION BY ist super, wenn du alle Zeilen behalten und für jede Zeile noch was extra berechnen willst. Zum Beispiel:
- Den Anteil jedes Produkts am Umsatz der Kategorie bestimmen.
- Zeilennummerierung innerhalb jeder Gruppe.
Beispiel für die Berechnung des Verkaufsanteils:
SELECT
category,
product,
sales,
ROUND(
(sales * 100.0) / SUM(sales) OVER (PARTITION BY category),
2
) AS sales_percentage
FROM sales_data;
Beispiel: mehrere Window-Funktionen nutzen
Einer der Vorteile von Window-Funktionen ist, dass du mehrere Berechnungen gleichzeitig machen kannst. Zum Beispiel:
SELECT
region,
city,
sales,
SUM(sales) OVER (PARTITION BY region) AS total_sales,
RANK() OVER (PARTITION BY region ORDER BY sales DESC) AS sales_rank
FROM sales_data;
Ergebnis:
| region | city | sales | total_sales | sales_rank |
|---|---|---|---|---|
| North | CityB | 150 | 250 | 1 |
| North | CityA | 100 | 250 | 2 |
| South | CityD | 250 | 450 | 1 |
| South | CityC | 200 | 450 | 2 |
Vorteile von Window-Funktionen gegenüber GROUP BY
Originaldaten bleiben erhalten: GROUP BY "komprimiert" Zeilen, Window-Funktionen lassen die Tabellenstruktur wie sie ist.
Mehrere Berechnungen in einer Query: Du kannst mehrere Window-Funktionen mit verschiedenen PARTITION BY und ORDER BY Parametern nutzen und trotzdem alle Daten behalten.
Flexibilität bei der Analyse: Window-Funktionen lassen sich easy anpassen: laufende Summen, Rankings, Anteile und vieles mehr.
Flexibilitäts-Beispiel
Probieren wir mal mehrere Funktionen zusammen:
SELECT
region,
city,
sales,
SUM(sales) OVER (PARTITION BY region) AS total_sales,
AVG(sales) OVER (PARTITION BY region) AS avg_sales,
RANK() OVER (PARTITION BY region ORDER BY sales DESC) AS rank
FROM sales_data;
Ergebnis:
| region | city | sales | total_sales | avg_sales | rank |
|---|---|---|---|---|---|
| North | CityB | 150 | 250 | 125.0 | 1 |
| North | CityA | 100 | 250 | 125.0 | 2 |
| South | CityD | 250 | 450 | 225.0 | 1 |
| South | CityC | 200 | 450 | 225.0 | 2 |
Einschränkungen und typische Fehler
Einer der häufigsten Fehler ist, PARTITION BY zu benutzen, wenn eigentlich eine "Komprimierung" der Daten nötig ist. Zum Beispiel, statt:
SELECT region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY region;
versuchen manche sowas zu schreiben:
SELECT
region,
SUM(sales) OVER (PARTITION BY region) AS total_sales
FROM sales_data;
Das gibt aber alle Zeilen zurück, ohne die Datenmenge zu reduzieren (was nicht immer das ist, was du willst).
Jetzt weißt du genau, wann du GROUP BY und wann Window-Funktionen benutzt. Das ist wie der Unterschied zwischen Hammer und Schraubenzieher: Beide arbeiten mit Nägeln... aber eben unterschiedlich.
GO TO FULL VERSION