Skip to content

SQL-Fensterfunktionen erklärt

Alle gängigen SQL-Fensterfunktionen und die Klauseln, die sie steuern, gruppiert nach Aufgabe: Zeilen einen Rang geben, in Nachbarzeilen schauen, Summen über einen Frame laufen lassen und erste oder letzte Werte holen. Jede Zeile ordnet der Funktion ein einzeiliges Beispiel zu.

Eine Fensterfunktion berechnet ein Ergebnis über Zeilen hinweg, die zur aktuellen Zeile gehören, ohne sie zusammenzufassen, wie es GROUP BY tut. Jede Fensterfunktion endet in einer OVER-Klausel, die das Fenster definiert: PARTITION BY gruppiert Zeilen, ORDER BY ordnet sie, und der optionale Frame begrenzt die gleitende Menge. Wer OVER beherrscht, für den ist der Rest Vokabular.

Nachschlagetabelle · 27 Einträge
27 of 27 rows
Rangfolge
Eine eindeutige fortlaufende Ganzzahl pro Zeile im Fenster.ROW_NUMBER() OVER (ORDER BY total DESC)
Rang mit Lücken; Gleichstände teilen sich einen Rang und die folgenden Nummern werden übersprungen.RANK() OVER (ORDER BY total DESC)
Rang ohne Lücken; Gleichstände teilen sich einen Rang, und nichts wird übersprungen.DENSE_RANK() OVER (ORDER BY total DESC)
Teilt das geordnete Fenster in n etwa gleich große Buckets.NTILE(4) OVER (ORDER BY total DESC)
Blick auf Nachbarn
Ein Wert von n Zeilen zurück; der Default tritt an seine Stelle, wenn es keine solche Zeile gibt.LAG(total, 1, 0) OVER (ORDER BY created_at)
Ein Wert von n Zeilen voraus; der Default tritt an seine Stelle, wenn es keine solche Zeile gibt.LEAD(total, 1, 0) OVER (ORDER BY created_at)
Aggregation über ein Fenster
Eine laufende oder partitionierte Summe, ohne Zeilen zusammenzufassen.SUM(total) OVER (ORDER BY created_at)
Ein laufender oder partitionierter Durchschnitt.AVG(total) OVER (PARTITION BY user_id)
Eine laufende oder partitionierte Zeilenanzahl.COUNT(*) OVER (PARTITION BY user_id)
Der niedrigste Wert im Fenster oder in der Partition.MIN(total) OVER (PARTITION BY user_id)
Der höchste Wert im Fenster oder in der Partition.MAX(total) OVER (PARTITION BY user_id)
SUM mit ORDER BY und einem am Anfang offenen Frame; jede Zeile summiert alles bis zu sich selbst.SUM(total) OVER (ORDER BY created_at ROWS UNBOUNDED PRECEDING)
AVG über einen Frame von n Zeilen vor und nach der aktuellen Zeile.AVG(total) OVER (ORDER BY created_at ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
Erste, letzte und Perzentile
Der erste Wert in der Reihenfolge des Fensters.FIRST_VALUE(total) OVER (ORDER BY total DESC)
Der letzte Wert im Frame; ohne UNBOUNDED FOLLOWING endet der Frame an der aktuellen Zeile.LAST_VALUE(total) OVER (ORDER BY total ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
Der Wert an der n-ten Zeile der Reihenfolge des Fensters.NTH_VALUE(total, 2) OVER (ORDER BY total DESC)
Der relative Rang einer Zeile, von 0 bis 1.PERCENT_RANK() OVER (ORDER BY total)
Der Anteil der Zeilen bis zur aktuellen Zeile, von 1/n bis 1.CUME_DIST() OVER (ORDER BY total)
Die OVER-Klausel
Definiert das Fenster, das jede Funktion liest.<fn>() OVER (PARTITION BY user_id ORDER BY created_at)
Startet das Fenster für jede Gruppe von Zeilen neu.PARTITION BY user_id
Ordnet die Zeilen innerhalb jeder Partition.ORDER BY created_at
Begrenzt den gleitenden Frame, z. B. von vorherigen bis zu folgenden Zeilen.ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
Begrenzt den Frame nach Werten, nicht nach Zeilenpositionen; CURRENT ROW schließt Gleichstände ein, und dies ist der Standardframe unter ORDER BY.RANGE BETWEEN 100 PRECEDING AND CURRENT ROW
Begrenzt den Frame nach Gruppen gebundener Zeilen aus dem ORDER BY.GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
Entfernt die aktuelle Zeile aus dem Frame; EXCLUDE TIES entfernt stattdessen ihre Gleichstände.ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW
Benennt ein Fenster einmal pro Abfrage, sodass mehrere OVER-Klauseln es wiederverwenden können.WINDOW w AS (PARTITION BY user_id ORDER BY created_at)
Schränkt die Zeilen ein, die eine Fensteraggregation liest, bevor das Fenster angewendet wird.SUM(total) FILTER (WHERE status = 'paid') OVER (ORDER BY created_at)