Oracle “partizione” Parola chiave
-
05-09-2019 - |
Domanda
Qualcuno può spiegare che cosa la parola partition by
fa e dare un semplice esempio di in azione, così come il motivo per cui si potrebbe desiderare di usarlo? Ho una query SQL scritto da qualcun altro e sto cercando di capire cosa fa.
Un esempio di partizione:
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
Gli esempi che ho visto on-line sembrano un po 'troppo in profondità.
Soluzione
La clausola PARTITION BY
imposta l'intervallo di record che verranno utilizzate per ogni "GRUPPO" all'interno della clausola di OVER
.
Nel tuo esempio SQL, DEPT_COUNT
restituirà il numero di dipendenti all'interno di quel reparto per ogni record dipendente. (E 'come se si sta de-nomalising tavolo emp
;. Ritorni ancora ogni record della tabella emp
)
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
Se ci fosse un'altra colonna (ad esempio, state
) allora si potrebbe contare quanti dipartimenti in questo Stato.
E 'come avere i risultati di una GROUP BY
(SUM
, AVG
, etc.) senza l'aggregazione del set di risultati (cioè la rimozione di record corrispondenti).
E 'utile quando si utilizzano le funzioni LAST OVER
o MIN OVER
per ottenere, ad esempio, lo stipendio più basso e più alto nel reparto e quindi utilizzare che in un calcolo contro questo record stipendio senza un sub selezionare , che è molto più veloce.
Leggi l'legata AskTom articolo per ulteriori dettagli.
Altri suggerimenti
Il concetto è molto ben spiegato con la risposta accettata, ma trovo che l'altro esempio si vede, meglio affonda nella Ecco un esempio incrementale:.
1) Boss dice "me ottenere il numero di articoli che abbiamo in magazzino raggruppati per marca"
Dici : "nessun problema"
SELECT
BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Risultato:
+--------------+---------------+
| Brand | Count |
+--------------+---------------+
| H&M | 50 |
+--------------+---------------+
| Hugo Boss | 100 |
+--------------+---------------+
| No brand | 22 |
+--------------+---------------+
2) il capo dice "Ora mi ottenere un elenco di tutti gli elementi, con il loro marchio e il numero di elementi che il rispettivo marchio ha"
Si può provare:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Ma si ottiene:
ORA-00979: not a GROUP BY expression
Questo è dove il OVER (PARTITION BY BRAND)
è disponibile in:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID) OVER (PARTITION BY BRAND)
FROM
ITEMS;
whic significa:
-
COUNT(ITEM_ID)
- ottenere il numero di elementi -
OVER
- Oltre l'insieme di righe -
(PARTITION BY BRAND)
- che hanno lo stesso marchio
E il risultato è il seguente:
+--------------+---------------+----------+
| 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 |
+--------------+---------------+----------+
ecc ...
E 'l'estensione SQL chiamato analisi. L ' "over" nell'istruzione SELECT dice oracolo che la funzione è una funzione analitica, non un gruppo in base alla funzione. Il vantaggio di utilizzare analisi è che è possibile raccogliere somme, conteggi, e molto di più con un solo passaggio attraverso dei dati invece che scorrendo i dati con seleziona sub o, peggio, PL / SQL.
Si ha un aspetto di confusione all'inizio, ma questa sarà una seconda natura in fretta. Nessuno lo spiega meglio di Tom Kyte. Così il link qui sopra è grande.
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
Qui stiamo ottenendo conteggio per rispettivi DEPTNO. Per quanto riguarda DEPTNO 10 abbiamo 4 record nella tabella EMP risultati simili per DEPTNO 20 e 30 anche.
la parola chiave partizione over è come se fossimo il partizionamento dei dati da parte client_id la creazione di un sottoinsieme di ogni cliente id
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;
questa query restituirà il numero di operazioni fatte dal client_id