Le OVER
La clause spécifie le partitionnement, l'ordre et la fenêtre "sur laquelle" la fonction analytique opère.
Exemple 1 :calcul d'une moyenne 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
Il opère sur une fenêtre mobile (3 lignes de large) sur les lignes, triées par date.
Exemple n° 2 :calculer un solde courant
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
Il fonctionne sur une fenêtre qui inclut la ligne actuelle et toutes les lignes précédentes.
Remarque :pour un agrégat avec un OVER
clause spécifiant une sorte ORDER
, la fenêtre par défaut est UNBOUNDED PRECEDING
à CURRENT ROW
, donc l'expression ci-dessus peut être simplifiée en, avec le même résultat :
SUM(amt) OVER (ORDER BY date)
Exemple 3 :calculez le maximum au sein de chaque groupe
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
Il fonctionne sur une fenêtre qui inclut toutes les lignes d'un département particulier.
Violon SQL :http://sqlfiddle.com/#!4/9eecb7d/122