Ich habe im GROUP BY
Laufe der Jahre für alle Arten von aggregierten Abfragen verwendet. Vor kurzem habe ich einen Code rückentwickelt PARTITION BY
, mit dem Aggregationen durchgeführt werden. Wenn ich die gesamte Dokumentation durchlese, über die ich etwas finden kann PARTITION BY
, hört es sich sehr nach etwas an GROUP BY
, vielleicht mit ein wenig zusätzlicher Funktionalität? Sind es zwei Versionen derselben allgemeinen Funktionalität oder sind sie etwas völlig anderes?
quelle
Wir können ein einfaches Beispiel nehmen.
Stellen Sie sich eine Tabelle
TableA
mit den folgenden Werten vor:GROUP BY
Syntax:
Wir können uns
GROUP BY
in unserer Tabelle bewerben :Ergebnisse:
In unserer realen Tabelle haben wir 7 Zeilen und wenn wir uns bewerben
GROUP BY id
, gruppiert der Server die Ergebnisse basierend aufid
:In einfachen Worten:
PARTITION BY
Bevor wir zu PARTITION BY gehen, schauen wir uns die
OVER
Klausel an:Gemäß der MSDN-Definition:
PARTITION BY reduziert nicht die Anzahl der zurückgegebenen Zeilen.
Wir können PARTITION BY in unserer Beispieltabelle anwenden:
Ergebnis:
Schauen Sie sich die Ergebnisse an - im Gegensatz zu GROUP BY werden die Zeilen partitioniert und alle Zeilen zurückgegeben.
quelle
partition by
kann die Anzahl der Zeilen beeinflussen, reduziert jedoch nicht die Anzahl der Zeilen.SELECT
inSELECT DISTINCT
die zweite Abfrage ändern würde ? würde das nicht den gleichen Datensatz wie dieGROUP BY
Abfrage zurückgeben? Was sind die Gründe für die Wahl des einen oder anderen?partition by
rollt die Daten nicht wirklich auf. Sie können damit etwas pro Gruppe zurücksetzen. Sie können beispielsweise eine Ordnungsspalte innerhalb einer Gruppe abrufen, indem Sie das Gruppierungsfeld partitionieren undrownum()
über die Zeilen innerhalb dieser Gruppe verwenden. Dies gibt Ihnen etwas, das sich ein bisschen wie eine Identitätsspalte verhält, die am Anfang jeder Gruppe zurückgesetzt wird.quelle
Gefunden unter diesem Link: OVER-Klausel
quelle
Es bietet aufgerollte Daten ohne Aufrollen
Angenommen, ich möchte die relative Position der Vertriebsregion zurückgeben
Mit PARTITION BY kann ich den Verkaufsbetrag für eine bestimmte Region und den MAX-Betrag für alle Verkaufsregionen in derselben Zeile zurückgeben.
Dies bedeutet, dass Sie sich wiederholende Daten haben, dies kann jedoch für den Endverbraucher in dem Sinne geeignet sein, dass Daten aggregiert wurden, aber keine Daten verloren gegangen sind - wie dies bei GROUP BY der Fall wäre.
quelle
PARTITION BY
ist analytisch, währendGROUP BY
es aggregiert ist. Um es verwenden zu könnenPARTITION BY
, müssen Sie es mit einer OVER-Klausel enthalten .quelle
PARTITION BY is analytic
Diese einfache Aussage hat mir viel klar gemacht. +1.Nach meinem Verständnis ist Partition By fast identisch mit Group By, jedoch mit folgenden Unterschieden:
Diese Gruppe gruppiert tatsächlich die Ergebnismenge, die eine Zeile pro Gruppe zurückgibt. Dies führt dazu, dass SQL Server in der SELECT-Liste nur Aggregatfunktionen oder Spalten zulässt, die Teil der group by-Klausel sind (in diesem Fall kann SQL Server garantieren, dass eindeutige Funktionen vorhanden sind Ergebnisse für jede Gruppe).
Stellen Sie sich zum Beispiel MySQL vor, das es erlaubt, in der SELECT-Liste Spalten zu haben, die nicht in der Group By-Klausel definiert sind. In diesem Fall wird immer noch eine Zeile pro Gruppe zurückgegeben. Wenn die Spalte jedoch keine eindeutigen Ergebnisse enthält, gibt es keine Garantie Was wird die Ausgabe sein!
Obwohl mit Partition By die Ergebnisse der Funktion mit den Ergebnissen einer Aggregatfunktion mit Group By identisch sind, erhalten Sie dennoch die normale Ergebnismenge, dh, Sie erhalten eine Zeile pro zugrunde liegender Zeile und nicht eine Zeile pro Zeile Gruppe, und aus diesem Grund kann man Spalten haben, die nicht pro Gruppe in der SELECT-Liste eindeutig sind.
Zusammenfassend ist Group By am besten geeignet, wenn eine Zeile pro Gruppe ausgegeben werden soll, und Partition By ist am besten geeignet, wenn alle Zeilen benötigt werden, die Aggregatfunktion jedoch weiterhin auf einer Gruppe basiert.
Natürlich kann es auch zu Leistungsproblemen kommen, siehe http://social.msdn.microsoft.com/Forums/ms-MY/transactsql/thread/0b20c2b5-1607-40bc-b7a7-0c60a2a55fba .
quelle
Wenn Sie verwenden
GROUP BY
, sind die resultierenden Zeilen normalerweise kleiner als eingehende Zeilen.Wenn Sie jedoch verwenden
PARTITION BY
, sollte die resultierende Zeilenanzahl mit der Anzahl der eingehenden Zeilen übereinstimmen.quelle
Angenommen, wir haben 14 Datensätze der
name
Spalte in der Tabelleim
group by
es wird in einer Reihe gezählt, dh 14
aber in
partition by
Es werden 14 Zeilen mehr gezählt
quelle
Kleine Beobachtung. Automatisierungsmechanismus zum dynamischen Generieren von SQL mithilfe der 'Partition von' ist in Bezug auf die 'Gruppieren von' viel einfacher zu implementieren. Im Fall von 'Gruppieren nach' müssen wir uns um den Inhalt der Spalte 'Auswählen' kümmern.
Entschuldigung für mein Englisch.
quelle
Es gibt wirklich verschiedene Nutzungsszenarien. Wenn Sie GROUP BY verwenden, führen Sie einige der Datensätze für dieselben Spalten zusammen und Sie haben eine Aggregation der Ergebnismenge.
Wenn Sie jedoch PARTITION BY verwenden, ist Ihre Ergebnismenge dieselbe, aber Sie haben nur eine Aggregation über die Fensterfunktionen und Sie führen die Datensätze nicht zusammen, Sie haben immer noch die gleiche Anzahl von Datensätzen.
Hier ist ein hilfreicher Artikel zur Rallye, der den Unterschied erklärt: http://alevryustemov.com/sql/sql-partition-by/
quelle
quelle