Was sind Fensterfunktionen?
Fensterfunktionen ermöglichen es Benutzern, Berechnungen mit Partitionen (d. h. Untergruppen oder Abschnitten) einer Ergebnismenge durchzuführen, typischerweise einer Tabelle oder den Ergebnissen einer anderen Abfrage. Im Gegensatz zu herkömmlichen Aggregationsfunktionen, die nur einen einzelnen Wert für jede in der Abfrage definierte Gruppe zurückgeben, geben Fensterfunktionen einen einzelnen Wert für jede Eingabezeile zurück.
Wie hilfreich sind Fensterfunktionen?
Fensterfunktionen erhöhen die Effizienz und reduzieren die Komplexität von Abfragen, die Partitionen (Fenster) eines Datensatzes analysieren, indem sie eine Alternative zu komplexeren SQL-Konzepten bieten, z. abgeleitete Abfragen. Häufige Anwendungsfälle sind:
- Ranking-Ergebnisse innerhalb eines bestimmten Fensters (z. B. Ranking pro Gruppe)
- Zugriff auf Daten aus einer anderen Zeile in einem bestimmten Fenster (z. B. periodische Berichte)
- Aggregation innerhalb eines bestimmten Fensters (z. B. laufende Summen):
Wie man Fensterfunktionen verwendet
Fensterfunktionen werden mit dem OVER
eingeleitet -Klausel und werden mit drei Konzepten konfiguriert:
- Fensterpartition (
PARTITION BY
) - gruppiert Zeilen in Partitionen - Fensterreihenfolge (
ORDER BY
) - definiert die Reihenfolge oder Reihenfolge der Zeilen innerhalb jedes Fensters - Fensterrahmen (
ROWS
) - definiert das Fenster durch Verwendung eines Offsets von der angegebenen Zeile
Syntaxübersicht
function (expression) OVER
( [ PARTITION BY expression_list ]
[ ORDER BY order_list ]
[ ROWS frame_clause ])
Definitionen
- expression_list:Kommagetrennte Liste von Ausdrücken, normalerweise Spaltennamen
- order_list:Kommagetrennte Liste von Ausdrücken, normalerweise Spaltennamen
- frame_clause:Definiere den Offset mit
CURRENT ROW
,_value_ PRECEDING
,UNBOUNDED PRECEDING
,_value_ FOLLOWING
,UNBOUNDED FOLLOWING
Beispiele
Ranking:Ranking pro Gruppe
SELECT
campaign
, month
, total_cost
, rank() OVER (PARTITION BY month ORDER BY month DESC, total_cost DESC) as "rank"
FROM Cost_by_Month
LIMIT 8
Vorherige Zeile:Zeitraum-über-Zeitraum-Analyse
SELECT
campaign
, month
, total_cost
, LAG(total_cost, 1) OVER (ORDER BY campaign, month) as "previous total cost"
FROM Cost_by_Month
WHERE campaign = 'TV'
LIMIT 4
Aggregation innerhalb eines Fensters:laufende Summen
SELECT
campaign, month, monthly_cost
, sum(monthly_cost) OVER (PARTITION BY campaign ORDER BY month ROWS BETWEEN UNBOUNDED
PRECEDING and CURRENT ROW) as "running cost total"
FROM Cost_by_Month
Dokumentation &Funktionsliste:
Bitte beachten Sie, dass von Datenbank zu Datenbank geringfügige Unterschiede in der Verwendung und Syntax bestehen. Für spezifische Informationen zu Ihrer Implementierung verwenden Sie bitte die unten bereitgestellte quellenspezifische Dokumentation.
Postgres
- Anleitung
- Funktionen
Rotverschiebung
- Anleitung
- Funktionen
Oracle
- Anleitung
SQLServer
- Anleitung
BigQuery
- Anleitung