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

È stato utile?

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.

Naturalmente, leggendo la è un must.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top