In diesem Artikel werden die SQL -Fensterfunktionen untersucht, die als Ranking-, Aggregat- und Wertfunktionen eingestuft werden. Es beschreibt ihre Verwendung bei der Berechnung der laufenden Summen und erörtert die Auswirkungen auf die Leistung und Kompatibilität mit verschiedenen Join -Typen. Das Hauptschwerpunkt
Die Fensterfunktionen in SQL erweitern die Funktionen von Standard -Aggregat -Funktionen, indem Berechnungen über eine Reihe von Tabellenzeilen in Bezug auf die aktuelle Zeile zugelassen werden. Sie gruppieren keine Zeilen zu einem kleineren Ergebnis, der eine GROUP BY
setzt. Stattdessen arbeiten sie auf einem "Fenster" von Zeilen, die von einer PARTITION BY
und ORDER BY
Klausel definiert sind. Es gibt drei Hauptkategorien:
ORDER BY
Klausel angegebenen Reihenfolge angegeben ist. Beispiele sind RANK()
, ROW_NUMBER()
, DENSE_RANK()
, NTILE()
. RANK()
kann mehreren Zeilen den gleichen Rang zuweisen, wenn sie in der Bestellspalte den gleichen Wert haben, während ROW_NUMBER()
jeder Zeile einen eindeutigen Rang zuweist, auch wenn sie gebunden sind. DENSE_RANK()
weist aufeinanderfolgende Ränge ohne Lücken zu und übersprungen Ränge, die den Verbindungen zugewiesen worden wären. NTILE()
teilt die Zeilen in eine bestimmte Anzahl von Gruppen.SUM
, AVG
, MIN
, MAX
, COUNT
) über das Fenster der Zeilen aus. Die wichtigste Differenz von Standard -Aggregat -Funktionen besteht darin, dass sie einen Wert für jede Zeile im Ergebnissatz zurückgeben, nicht für jede Gruppe ein einzelner aggregierter Wert. Zum Beispiel würde SUM() OVER (PARTITION BY department ORDER BY salary)
die kumulative Summe der Gehälter für jede Abteilung berechnen, die nach Gehalt bestellt wird.LAG()
und LEAD()
sind häufige Beispiele, wobei Werte von Zeilen vor oder nach Erfolg der aktuellen Zeile abrufen. FIRST_VALUE()
und LAST_VALUE()
Rufen Sie die ersten und letztes Werte innerhalb des Fensters ab. Diese sind nützlich, um den Wert einer Reihe mit seinen Nachbarn zu vergleichen oder Kontextinformationen zu finden. Ausführende Summen, auch als kumulative Summen bezeichnet, können leicht unter Verwendung von Fensterfunktionen berechnet werden. Die Kernkomponente ist die SUM()
-Strugatfensterfunktion in Kombination mit einer geeigneten ORDER BY
Klausel.
Nehmen wir an, wir haben eine Tabelle namens sales
mit Spalten date
und amount
. Berechnung der laufenden Verkäufe für jeden Tag:
<code class="sql">SELECT date, amount, SUM(amount) OVER (ORDER BY date) as running_total FROM sales;</code>
Diese Abfrage bestellt den Umsatz nach Datum und dann für jede Zeile SUM(amount) OVER (ORDER BY date)
berechnet die amount
für alle Zeilen bis und einschließlich der aktuellen Zeile.
Wenn Sie die von einer bestimmten Kategorie (z. B. Produktkategorie) verteilten laufenden Summen berechnen möchten, würden Sie eine PARTITION BY
Klausel hinzufügen:
<code class="sql">SELECT product_category, date, amount, SUM(amount) OVER (PARTITION BY product_category ORDER BY date) as running_total_by_category FROM sales;</code>
Dies liefert für jede product_category
eine separate laufende Gesamtsumme.
Während die Fensterfunktionen leistungsfähig sind, können sie die Abfrageleistung beeinflussen, insbesondere in komplexen Abfragen oder in großen Datensätzen. Die Auswirkungen auf die Leistung hängen von mehreren Faktoren ab:
PARTITION BY
und ORDER BY
Klauseln, insbesondere solche, die mehrere Spalten oder nicht indizierte Spalten betreffen, können die Verarbeitungszeit erheblich erhöhen. Eine effiziente Indizierung ist für die Leistung von entscheidender Bedeutung.Leistungsprobleme zu mildern:
PARTITION BY
und ORDER BY
Klauseln verwendet werden, sind wesentlich.PARTITION BY
und ORDER BY
Klauseln so einfach wie möglich.Ja, Fensterfunktionen können mit verschiedenen Arten von Verbindungen verwendet werden, aber die Fensterdefinition muss sorgfältig berücksichtigt werden. Das Fenster ist nach dem Verbindungsvorgang definiert.
Wenn Sie beispielsweise zwei Tabellen, orders
und customers
haben, die an customer_id
verbunden sind, können Sie eine Fensterfunktion verwenden, um den Gesamtbestellwert für jeden Kunden zu berechnen:
<code class="sql">SELECT o.order_id, c.customer_name, o.order_value, SUM(o.order_value) OVER (PARTITION BY c.customer_id) as total_customer_value FROM orders o JOIN customers c ON o.customer_id = c.customer_id;</code>
Hier berechnet die Fensterfunktionsumme SUM(o.order_value) OVER (PARTITION BY c.customer_id)
die Summe der Bestellwerte für jeden Kunden, nachdem der JOIN
-Betrieb die Daten aus beiden Tabellen kombiniert hat. Die PARTITION BY
Klausel stellt sicher, dass die Summe für jeden Kunden separat berechnet wird. Das gleiche Prinzip gilt für andere Join -Typen (linker Join, rechts Join, Full Outer Join). Der Schlüssel ist, dass die Fensterfunktion auf dem vom Join erzeugten Ergebnismengen funktioniert.
Das obige ist der detaillierte Inhalt vonWas sind die verschiedenen Arten von Fensterfunktionen in SQL (Ranking, Aggregat, Wert)?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!