it-swarm.com.de

Oracle-Schlüsselwort "Partition By"

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.

238
Alex Beardsley

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.

243
Guy

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 Items
  • OVER - Über der Reihe von Zeilen
  • (PARTITION BY BRAND) - die die gleiche Marke haben

Und 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...

137
Andrejs

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.

26
user60890
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.

10
VISHAL PANDEY

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

2
issam