Kann jemand bitte erklären, was das partition by
Schlüsselwort tut und ein einfaches Beispiel dafür in Aktion geben und warum man es verwenden möchte? Ich habe eine SQL-Abfrage, die von jemand anderem geschrieben wurde, und ich versuche herauszufinden, was sie bewirkt.
Ein Beispiel für eine Partition von:
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
Die Beispiele, die ich online gesehen habe, scheinen etwas zu ausführlich zu sein.
sql
oracle
window-functions
Alex Beardsley
quelle
quelle
Antworten:
Die
PARTITION BY
Klausel legt den Datensatzbereich fest, der für jede "GROUP" innerhalb derOVER
Klausel verwendet wird.In Ihrem Beispiel gibt SQL
DEPT_COUNT
die Anzahl der Mitarbeiter in dieser Abteilung für jeden Mitarbeiterdatensatz zurück. (Es ist, als würden Sie dieemp
Tabelle de-nomalisieren . Sie geben trotzdem jeden Datensatz in deremp
Tabelle zurück.)Wenn es eine andere Spalte gäbe (z. B.
state
), könnten Sie zählen, wie viele Abteilungen sich in diesem Staat befinden.Es ist wie immer die Ergebnisse eines
GROUP BY
(SUM
,AVG
usw.) , ohne das die Ergebnismenge Aggregation (dh passende Datensätze zu entfernen).Es ist nützlich, wenn Sie die Funktionen
LAST OVER
oderMIN OVER
verwenden, um beispielsweise das niedrigste und höchste Gehalt in der Abteilung zu erhalten, und dieses dann in einer Berechnung für dieses Datensatzgehalt ohne Unterauswahl verwenden, was viel schneller ist.Lesen Sie den verlinkten AskTom-Artikel für weitere Details.
quelle
last over
und istmin over
. Ich würde mir vorstellen, dass eine Unterauswahl langsamer ist, aber die englische Grammatik in der Antwort legt dies nicht nahe.Das Konzept wird durch die akzeptierte Antwort sehr gut erklärt, aber ich finde, je mehr Beispiele man sieht, desto besser sinkt es ein. Hier ist ein inkrementelles Beispiel:
1) Boss sagt "Hol mir die Anzahl der Artikel, die wir auf Lager haben, gruppiert nach Marke"
Sie sagen : "kein Problem"
Ergebnis:
2) Der Chef sagt: "Jetzt bekomme ich eine Liste aller Artikel mit ihrer Marke UND der Anzahl der Artikel, die die jeweilige Marke hat."
Sie können versuchen:
Aber du bekommst:
Hier kommt das ins
OVER (PARTITION BY BRAND)
Spiel:Was bedeutet:
COUNT(ITEM_ID)
- Holen Sie sich die Anzahl der ArtikelOVER
- Über den Satz von Zeilen(PARTITION BY BRAND)
- die die gleiche Marke habenUnd das Ergebnis ist:
etc...
quelle
Es ist die SQL-Erweiterung namens Analytics. Das "Over" in der select-Anweisung teilt Oracle mit, dass die Funktion eine analytische Funktion ist, keine Gruppe nach Funktion. Der Vorteil der Verwendung von Analysen besteht darin, dass Sie mit nur einem Durchgang der Daten Summen, Zählungen und vieles mehr erfassen können, anstatt die Daten mit Unterauswahl oder schlechter PL / SQL zu durchlaufen.
Es sieht auf den ersten Blick verwirrend aus, aber dies wird schnell zur zweiten Natur. Niemand erklärt es besser als Tom Kyte. Der obige Link ist also großartig.
Natürlich ist das Lesen der Dokumentation ein Muss.
quelle
Hier werden wir für die jeweilige Abteilung gezählt. Für Abt. 10 haben wir 4 Datensätze in der Tabelle mit ähnlichen Ergebnissen für Abt. 20 und 30.
quelle
Das Schlüsselwort over partition ist so, als würden wir die Daten durch client_id partitionieren und eine Teilmenge jeder Client-ID erstellen
Diese Abfrage gibt die Anzahl der von der client_id ausgeführten Operationen zurück
quelle
Ich denke, dieses Beispiel schlägt eine kleine Nuance vor, wie die Partitionierung funktioniert und wie Gruppieren nach funktioniert. Mein Beispiel stammt aus Oracle 12, wenn mein Beispiel ein Kompilierungsfehler ist.
Ich habe es versucht :
Dies funktioniert jedoch wie erwartet:
Erzeugen der Anzahl von Elementen in jedem Zustand basierend auf dem externen Schlüssel "data_key". Wenn also data_key = 'APPLE' 3 Zeilen mit dem Status 'A', 2 Zeilen mit dem Status 'B' und eine Zeile mit dem Status 'C' hätte, wäre die entsprechende Zeile für 'APPLE' 'APPLE', 3, 2 , 1, 6.
quelle