Oracle
 sql >> Database >  >> RDS >> Oracle

Clausola OVER in Oracle

Il OVER La clausola specifica il partizionamento, l'ordinamento e la finestra "su cui" opera la funzione analitica.

Esempio n. 1:calcola una media mobile

AVG(amt) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)

date   amt   avg_amt
=====  ====  =======
1-Jan  10.0  10.5
2-Jan  11.0  17.0
3-Jan  30.0  17.0
4-Jan  10.0  18.0
5-Jan  14.0  12.0

Funziona su una finestra mobile (larga 3 righe) sopra le righe, ordinate per data.

Esempio n. 2:calcolare un saldo corrente

SUM(amt) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

date   amt   sum_amt
=====  ====  =======
1-Jan  10.0  10.0
2-Jan  11.0  21.0
3-Jan  30.0  51.0
4-Jan  10.0  61.0
5-Jan  14.0  75.0

Funziona su una finestra che include la riga corrente e tutte le righe precedenti.

Nota:per un aggregato con un OVER clausola che specifica un ordinamento ORDER , la finestra predefinita è UNBOUNDED PRECEDING a CURRENT ROW , quindi l'espressione sopra può essere semplificata, con lo stesso risultato:

SUM(amt) OVER (ORDER BY date)

Esempio n. 3:calcola il massimo all'interno di ciascun gruppo

MAX(amt) OVER (PARTITION BY dept)

dept  amt   max_amt
====  ====  =======
ACCT   5.0   7.0
ACCT   7.0   7.0
ACCT   6.0   7.0
MRKT  10.0  11.0
MRKT  11.0  11.0
SLES   2.0   2.0

Funziona su una finestra che include tutte le righe per un particolare reparto.

SQL Fiddle:http://sqlfiddle.com/#!4/9eeb7d/122