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