Quel est le sens de la clause OVER dans Oracle?
La clause OVER spécifie la partition, l'ordre et la fenêtre "sur lesquels" la fonction analytique agit.
Par exemple, ceci calcule 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 fonctionne sur une fenêtre mobile (3 rangs de large), rangée par date.
Ceci calcule 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 en cours et toutes les lignes précédentes.
Ceci calcule le maximum, séparément pour chaque "département":
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
Vous pouvez l'utiliser pour transformer certaines fonctions d'agrégat en fonctions analytiques:
SELECT MAX(date)
FROM mytable
retournera 1
rangée avec un seul maximum,
SELECT MAX(date) OVER (ORDER BY id)
FROM mytable
retournera toutes les lignes avec un maximum courant.
Cela fait partie des fonctions analytiques Oracle .