USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, ProductID, OrderQty
,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'
,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Avg'
,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Count'
,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Min'
,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Max'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
Ich habe über diese Klausel gelesen und verstehe nicht, warum ich sie brauche. Was macht die Funktion Over
? Was macht Partitioning By
das Warum kann ich beim Schreiben keine Anfrage stellen Group By SalesOrderID
?
mysql
sql
sql-server
aggregate-functions
clause
Mit fliegenden Farben
quelle
quelle
Antworten:
Sie können verwenden
GROUP BY SalesOrderID
. Der Unterschied besteht darin, dass Sie mit GROUP BY nur die aggregierten Werte für die Spalten haben können, die nicht in GROUP BY enthalten sind.Im Gegensatz dazu können Sie mithilfe von Fensteraggregatfunktionen anstelle von GROUP BY sowohl aggregierte als auch nicht aggregierte Werte abrufen. Das heißt, obwohl Sie dies in Ihrer Beispielabfrage nicht tun, können Sie sowohl einzelne
OrderQty
Werte als auch deren Summen, Zählungen, Durchschnittswerte usw. über Gruppen derselbenSalesOrderID
s abrufen .Hier ist ein praktisches Beispiel dafür, warum Fensteraggregate großartig sind. Angenommen, Sie müssen berechnen, wie viel Prozent eines Gesamtwerts jeder Wert ist. Ohne Fensteraggregate müssten Sie zuerst eine Liste der aggregierten Werte ableiten und diese dann wieder mit dem ursprünglichen Rowset verbinden, dh wie folgt:
Schauen Sie sich nun an, wie Sie dasselbe mit einem Fensteraggregat tun können:
Viel einfacher und sauberer, nicht wahr?
quelle
Die
OVER
Klausel ist insofern mächtig, als Sie Aggregate über verschiedene Bereiche ("Fenster") haben können, unabhängig davon, ob Sie a verwendenGROUP BY
oder nichtBeispiel: Anzahl pro
SalesOrderID
und Anzahl von allen abrufenHolen Sie sich verschiedene
COUNT
s, neinGROUP BY
quelle
Wenn Sie nur nach der SalesOrderID gruppieren möchten, können Sie die Spalten ProductID und OrderQty nicht in die SELECT-Klausel aufnehmen.
Mit der PARTITION BY-Klausel können Sie Ihre Aggregatfunktionen aufteilen. Ein naheliegendes und nützliches Beispiel wäre, wenn Sie Zeilennummern für Bestellpositionen in einer Bestellung generieren möchten:
(Meine Syntax ist möglicherweise etwas falsch)
Sie würden dann etwas zurückbekommen wie:
quelle
Lassen Sie mich anhand eines Beispiels erklären, und Sie können sehen, wie es funktioniert.
Angenommen, Sie haben die folgende Tabelle DIM_EQUIPMENT:
Führen Sie unter SQL aus
Das Ergebnis wäre wie folgt
Sehen Sie, was passiert ist.
Sie können ohne Gruppierung nach JAHR zählen und mit REIHE abgleichen.
Ein weiterer interessanter Weg, um das gleiche Ergebnis zu erzielen, wenn WITH wie unten unter Verwendung der WITH-Klausel als Inline-VIEW funktioniert und die Abfrage besonders komplexer vereinfachen kann, was hier jedoch nicht der Fall ist, da ich nur versuche, die Verwendung zu zeigen
quelle
Die OVER-Klausel in Kombination mit PARTITION BY besagt, dass der vorhergehende Funktionsaufruf analytisch durchgeführt werden muss, indem die zurückgegebenen Zeilen der Abfrage ausgewertet werden. Stellen Sie sich das als Inline-Anweisung GROUP BY vor.
OVER (PARTITION BY SalesOrderID)
gibt an, dass für die Funktion SUM, AVG usw. der Wert OVER eine Teilmenge der zurückgegebenen Datensätze aus der Abfrage zurückgegeben und diese Teilmenge durch den Fremdschlüssel SalesOrderID PARTITIONIERT wird.Daher summieren wir jeden OrderQty-Datensatz für JEDE EINZIGARTIGE SalesOrderID, und dieser Spaltenname heißt 'Total'.
Es ist ein VIEL effizienteres Mittel als die Verwendung mehrerer Inline-Ansichten, um dieselben Informationen herauszufinden. Sie können diese Abfrage in eine Inline-Ansicht einfügen und dann nach Gesamt filtern.
quelle
Query Petition
Klausel genannt.Ähnlich der
Group By
KlauselSyntax:
function (...) OVER (PARTITION BY col1 col3, ...)
Funktionen
COUNT()
,SUM()
,MIN()
,MAX()
, usw.ROW_NUMBER()
,RATION_TO_REOIRT()
usw.)Weitere Informationen mit Beispiel: http://msdn.microsoft.com/en-us/library/ms189461.aspx
quelle
Das ist ein Ergebnis der Abfrage. Die als Quelle verwendete Tabelle ist dieselbe, außer dass sie keine letzte Spalte enthält. Diese Spalte ist eine gleitende Summe der dritten.
Abfrage:
(Tabelle geht als public.iuk)
Es ist etwas über dem Niveau von dbase (1986), ich weiß nicht, warum mehr als 25 Jahre benötigt wurden, um es fertigzustellen.
quelle