De OVER
clausule specificeert de partitionering, volgorde en venster "waarover" de analytische functie werkt.
Voorbeeld #1:bereken een voortschrijdend gemiddelde
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
Het werkt via een bewegend venster (3 rijen breed) over de rijen, gerangschikt op datum.
Voorbeeld #2:een lopend saldo berekenen
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
Het werkt via een venster dat de huidige rij en alle voorgaande rijen bevat.
Opmerking:voor een aggregaat met een OVER
clausule die een sortering specificeert ORDER
, het standaardvenster is UNBOUNDED PRECEDING
naar CURRENT ROW
, dus de bovenstaande uitdrukking kan worden vereenvoudigd tot, met hetzelfde resultaat:
SUM(amt) OVER (ORDER BY date)
Voorbeeld #3:bereken het maximum binnen elke groep
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
Het werkt via een venster dat alle rijen voor een bepaalde afdeling bevat.
SQL Fiddle:http://sqlfiddle.com/#!4/9eecb7d/122