Premium

Partitionen in Window Functions

Im vorigen Artikel haben wir bereits kurz erwähnt, was Partitionen sind und wie man sie in Window Functions verwendet. Zeit, sie genauer zu betrachten 🤓.

Was ist eine Partition?

Partitionen sind Teilmengen von Zeilen, die für eine Window Function auf Basis einer oder mehrerer Spalten gebildet werden.

Sie dienen dazu, Daten zu segmentieren und erlauben so eine genauere Analyse sowie Berechnungen wie Aggregation oder Ranking innerhalb jeder Gruppe.

Wenn wir zum Beispiel eine Tabelle mit Mietpreisen nach dem Unterkunftstyp partitionieren, können wir in einer separaten Spalte etwa den Durchschnittspreis pro Unterkunftstyp berechnen.

Schema einer Partitionierung

Partitionen in SQL anwenden

Um eine Partition zusammen mit einer Window Function zu verwenden, hältst du dich an folgende Syntax:

MySQL 8.1
SELECT <window_function>(<tabellen_feld>)
OVER (
    PARTITION BY <spalten_zum_partitionieren>
)

Beispiel

Schauen wir uns die Verwendung einer Partition mit einer Window Function an einem einfachen Beispiel an.

Wir betrachten die Tabelle Rooms, konkret die Felder home_type und price:

MySQL 8.1
SELECT home_type, price FROM Rooms;
home_typeprice
Private room149
Entire home/apt225
Private room150
Entire home/apt89
Entire home/apt80
Entire home/apt200
Private room60
Private room79
Private room79
Entire home/apt150
Entire home/apt135
Private room85
Private room89
Private room85
Entire home/apt120
Entire home/apt140
Entire home/apt215
Private room140
Entire home/apt99
Entire home/apt190
Entire home/apt299
Private room130
Private room80
Private room110
Entire home/apt120
Private room60
Private room80
Entire home/apt150
Private room44
Entire home/apt180
Private room50
Private room52
Private room55
Private room50
Private room70
Private room89
Private room35
Entire home/apt85
Private room150
Shared room40
Private room68
Entire home/apt120
Private room120
Private room135
Entire home/apt150
Entire home/apt150
Private room130
Entire home/apt110
Entire home/apt115
Private room80

Wir sehen, dass alle Mietangebote in 3 Kategorien aufgeteilt sind: „Private room“, „Entire home/apt“ und „Shared room“.

Jede Kategorie hat ihren eigenen Preisrahmen. Um den Durchschnittspreis innerhalb einer Kategorie zu ermitteln und ihn mit dem aktuellen Preis zu vergleichen, kommen Window Functions wie gerufen.

Dazu ergänzen wir unsere Ergebnistabelle um eine weitere Spalte avg_price, die den Durchschnittspreis pro Kategorie berechnet. Das sieht so aus:

MySQL 8.1
SELECT
    home_type, price,
    AVG(price) OVER (PARTITION BY home_type) AS avg_price
FROM Rooms
home_typepriceavg_price
Entire home/apt225148.6667
Entire home/apt180148.6667
Entire home/apt150148.6667
Entire home/apt85148.6667
Entire home/apt120148.6667
Entire home/apt120148.6667
Entire home/apt299148.6667
Entire home/apt190148.6667
Entire home/apt99148.6667
Entire home/apt215148.6667
Entire home/apt140148.6667
Entire home/apt120148.6667
Entire home/apt150148.6667
Entire home/apt135148.6667
Entire home/apt150148.6667
Entire home/apt110148.6667
Entire home/apt115148.6667
Entire home/apt200148.6667
Entire home/apt150148.6667
Entire home/apt80148.6667
Entire home/apt89148.6667
Private room6889.4286
Private room5089.4286
Private room7089.4286
Private room8089.4286
Private room8989.4286
Private room14989.4286
Private room3589.4286
Private room15089.4286
Private room13089.4286
Private room12089.4286
Private room13589.4286
Private room13089.4286
Private room15089.4286
Private room6089.4286
Private room7989.4286
Private room7989.4286
Private room8589.4286
Private room8989.4286
Private room8589.4286
Private room14089.4286
Private room5589.4286
Private room8089.4286
Private room11089.4286
Private room6089.4286
Private room8089.4286
Private room4489.4286
Private room5089.4286
Private room5289.4286
Shared room4040

Was passiert in der hinzugefügten Zeile?

  • PARTITION BY home_type teilt alle Datensätze in verschiedene Partitionen auf Basis der eindeutigen Werte der Spalte home_type auf.
  • Anschließend berechnet AVG(price) für jeden Datensatz den Durchschnittspreis (price) innerhalb seiner Partition (home_type).

Das Ergebnis dieses Teils der Query ist die Spalte avg_price, in der für jeden Datensatz der Durchschnittspreis seiner Unterkunftskategorie (home_type) steht.

Partitionen über mehrere Spalten

Die Partitionierung kann auch über mehrere Spalten erfolgen. Das ermöglicht komplexere und genauere Segmente für die Analyse.

Für unsere Tabelle Rooms können wir zum Beispiel Partitionen auf Basis von 2 Spalten bilden: der Unterkunftskategorie home_type und der Verfügbarkeit eines Fernsehers has_tv.

Beispiel-Query mit Partitionierung nach zwei Spalten:

MySQL 8.1
SELECT
    home_type, has_tv, price,
    AVG(price) OVER (PARTITION BY home_type, has_tv) AS avg_price
    FROM Rooms
home_typehas_tvpriceavg_price
Entire home/apt0225170
Entire home/apt0180170
Entire home/apt080170
Entire home/apt0200170
Entire home/apt0150170
Entire home/apt0150170
Entire home/apt0190170
Entire home/apt0215170
Entire home/apt0140170
Entire home/apt199132.6667
Entire home/apt185132.6667
Entire home/apt1150132.6667
Entire home/apt1120132.6667
Entire home/apt1120132.6667
Entire home/apt1299132.6667
Entire home/apt1120132.6667
Entire home/apt1135132.6667
Entire home/apt1150132.6667
Entire home/apt1110132.6667
Entire home/apt189132.6667
Entire home/apt1115132.6667
Private room08578.5455
Private room03578.5455
Private room015078.5455
Private room05578.5455
Private room05278.5455
Private room05078.5455
Private room06878.5455
Private room06078.5455
Private room013578.5455
Private room08578.5455
Private room08978.5455
Private room112096.4706
Private room18096.4706
Private room114996.4706
Private room113096.4706
Private room18996.4706
Private room17096.4706
Private room15096.4706
Private room14496.4706
Private room18096.4706
Private room16096.4706
Private room111096.4706
Private room18096.4706
Private room113096.4706
Private room114096.4706
Private room17996.4706
Private room17996.4706
Private room115096.4706
Shared room14040

Hier bildet PARTITION BY home_type, has_tv eindeutige Partitionen für jede Kombination aus home_type und has_tv und erlaubt es, den Durchschnittspreis innerhalb einer Kategorie für Unterkünfte mit bzw. ohne Fernseher zu berechnen.

Partitionen über 2 Spalten