Kursinhalt
Fortgeschrittene Techniken in SQL
Fortgeschrittene Techniken in SQL
Arten von Fensterfunktionen
Lassen Sie uns kurz die Haupttypen von Fensterfunktionen erkunden, die in SQL verwendet werden.
Aggregatfunktionen
Dies sind die Standard-Aggregatfunktionen (AVG
, SUM
, MAX
, MIN
, COUNT
), die in einem Fensterkontext verwendet werden. Wir haben diesen Typ von Fensterfunktion bereits im vorherigen Kapitel verwendet.
Ranking-Funktionen
Ranking-Funktionen in SQL sind eine Art von Fensterfunktion, die es Ihnen ermöglicht, jeder Zeile innerhalb einer Partition eines Ergebnismenge einen Rang zuzuweisen. Diese Funktionen können äußerst nützlich für die Durchführung von geordneten Berechnungen und Analysen sein.
-
RANK()
: Weist jeder eindeutigen Zeile innerhalb der Partition basierend auf derORDER BY
-Klausel einen eindeutigen Rang zu. Zeilen mit gleichen Werten erhalten denselben Rang, wobei Lücken in der Rangfolge gelassen werden; -
DENSE_RANK()
: Ähnlich wie RANK(), jedoch ohne Lücken in der Rangfolge; -
NTILE(n)
: Teilt die Zeilen in einer geordneten Partition inn
Gruppen und weist jeder Zeile eine Gruppennummer zu.
Beispiel
Wir werden die Verkäufe basierend auf dem Amount
für jede ProductID
in aufsteigender Reihenfolge mit der DENSE_RANK()
-Funktion bewerten:
SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
Die Ergebnistabelle enthält alle Informationen aus der Haupttabelle und eine zusätzliche Spalte, die den Rang jedes Verkaufs für das jeweilige Produkt angibt.
Wertvergleichsfunktionen
Wertvergleichsfensterfunktionen in SQL werden verwendet, um Werte in der aktuellen Zeile mit Werten in anderen Zeilen innerhalb derselben Partition zu vergleichen.
Diese Funktionen sind besonders nützlich für Aufgaben, die die Analyse von Trends, Berechnungen basierend auf benachbarten Zeilen oder den Zugriff auf bestimmte Zeilenwerte innerhalb eines definierten Fensters umfassen.
Es gibt mehrere Wertvergleichsfunktionen in SQL:
LAG()
: Ruft den Wert aus einer vorherigen Zeile im Ergebnissatz ab, ohne dass ein Selbst-Join erforderlich ist;LEAD()
: Ruft den Wert aus einer nachfolgenden Zeile im Ergebnissatz ab, ohne dass ein Selbst-Join erforderlich ist;FIRST_VALUE()
: Gibt den Wert der ersten Zeile im Fensterrahmen zurück;LAST_VALUE()
: Gibt den Wert der letzten Zeile im Fensterrahmen zurück.
Beispiel
Verwenden wir die LAG()
-Wertvergleichsfensterfunktion, um die Änderung des Verkaufsbetrags vom vorherigen Verkauf für jedes Produkt zu berechnen:
SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS amount_change FROM Sales ORDER BY product_id, sales_date;
Als Ergebnis könnten wir einfach Informationen über Verkaufsunterschiede für jedes bestimmte Produkt extrahieren, ohne Unterabfragen oder gespeicherte Prozeduren zu verwenden. Wir können auch Unterschiede für alle Verkäufe ohne Partitionierung mit der folgenden Abfrage berechnen:
SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (ORDER BY sales_date) AS amount_change FROM Sales;
Sie können sehen, dass wir die PARTITION BY
-Klausel im OVER
-Block nicht eingeschlossen haben. Das bedeutet, dass wir nicht nur die vorherigen Werte für ein bestimmtes Produkt erhalten möchten, sondern für alle Verkäufe in der Tabelle.
Danke für Ihr Feedback!