Kann mir bitte jemand erklären, was der partition by
Schlüsselwort funktioniert und ein einfaches Beispiel dafür in Aktion geben, sowie warum sollte man es verwenden wollen? Ich habe eine SQL-Abfrage von jemand anderem geschrieben und ich versuche herauszufinden, was es tut.
Ein Beispiel für die Partitionierung durch:
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.
Das PARTITION BY
-Klausel legt den Datensatzbereich fest, der für jede "GROUP" in der OVER
-Klausel verwendet wird.
In Ihrem Beispiel-SQL ist DEPT_COUNT
gibt die Anzahl der Mitarbeiter in dieser Abteilung für jeden Mitarbeiterdatensatz zurück. (Es ist, als würden Sie die Tabelle emp
de-nomalisieren; Sie geben weiterhin jeden Datensatz in der Tabelle emp
zurück.)
emp_no dept_no DEPT_COUNT
1 10 3
2 10 3
3 10 3 <- three because there are three "dept_no = 10" records
4 20 2
5 20 2 <- two because there are two "dept_no = 20" records
Wenn es eine andere Spalte gäbe (z. B. state
), könnten Sie die Anzahl der Abteilungen in diesem Staat zählen.
Es ist wie das Erhalten der Ergebnisse eines GROUP BY
(SUM
, AVG
usw.), ohne die Ergebnismenge zu aggregieren (d. h. übereinstimmende Datensätze zu entfernen).
Es ist nützlich, wenn Sie das LAST OVER
oder MIN OVER
dient beispielsweise dazu, das niedrigste und das höchste Gehalt in der Abteilung abzurufen und dieses dann in einer Berechnung gegen dieses Datensatzgehalt ohne eine Unterauswahl zu verwenden , was viel schneller geht.
Lesen Sie das verlinkte AskTom-Artikel für weitere Details.
Das Konzept wird durch die akzeptierte Antwort sehr gut erklärt, aber ich finde, je mehr Beispiel man sieht, desto besser setzt es sich durch. Hier ist ein inkrementelles Beispiel:
1) Chef sagt "Erhalte mir die Anzahl der Artikel, die wir auf Lager haben, sortiert nach Marke"
Sie sagen: "kein Problem"
SELECT
BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Ergebnis:
+--------------+---------------+
| Brand | Count |
+--------------+---------------+
| H&M | 50 |
+--------------+---------------+
| Hugo Boss | 100 |
+--------------+---------------+
| No brand | 22 |
+--------------+---------------+
2) Der Chef sagt "Jetzt bekomme ich eine Liste aller Artikel mit Marke und Anzahl der Artikel, die die jeweilige Marke hat."
Sie können versuchen:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Aber du bekommst:
ORA-00979: not a GROUP BY expression
Hier kommt die OVER (PARTITION BY BRAND)
ins Spiel:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID) OVER (PARTITION BY BRAND)
FROM
ITEMS;
Was bedeutet:
COUNT(ITEM_ID)
- Liefert die Anzahl der ItemsOVER
- Über der Reihe von Zeilen(PARTITION BY BRAND)
- die die gleiche Marke habenUnd das Ergebnis ist:
+--------------+---------------+----------+
| Items | Brand | Count() |
+--------------+---------------+----------+
| Item 1 | Hugo Boss | 100 |
+--------------+---------------+----------+
| Item 2 | Hugo Boss | 100 |
+--------------+---------------+----------+
| Item 3 | No brand | 22 |
+--------------+---------------+----------+
| Item 4 | No brand | 22 |
+--------------+---------------+----------+
| Item 5 | H&M | 50 |
+--------------+---------------+----------+
usw...
Dies ist die SQL-Erweiterung namens analytics. Das "over" in der select-Anweisung weist Oracle darauf hin, dass es sich bei der Funktion um eine analytische Funktion handelt, nicht um eine Gruppe nach Funktion. Der Vorteil der Verwendung von Analytics besteht darin, dass Sie mit nur einem Durchlauf der Daten Summen, Zählungen und vieles mehr erfassen können, anstatt die Daten mit Sub-Selects oder schlechter PL/SQL zu durchlaufen.
Auf den ersten Blick sieht es verwirrend aus, aber das 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.
EMPNO DEPTNO DEPT_COUNT
7839 10 4
5555 10 4
7934 10 4
7782 10 4 --- 4 records in table for dept 10
7902 20 4
7566 20 4
7876 20 4
7369 20 4 --- 4 records in table for dept 20
7900 30 6
7844 30 6
7654 30 6
7521 30 6
7499 30 6
7698 30 6 --- 6 records in table for dept 30
Hier werden die jeweiligen Abteilungen gezählt. Was die Abteilung 10 betrifft, haben wir 4 Datensätze in der Tabelle mit ähnlichen Ergebnissen auch für die Abteilung 20 und 30.
das Schlüsselwort over partition ist, als würden wir die Daten durch die Erstellung von client_id in eine Teilmenge jeder Client-ID partitionieren
select client_id, operation_date,
row_number() count(*) over (partition by client_id order by client_id ) as operationctrbyclient
from client_operations e
order by e.client_id;
diese Abfrage gibt die Anzahl der von der client_id ausgeführten Operationen zurück