OVER clause Oracle
-
11-09-2019 - |
Question
Quel est le sens de la clause OVER dans Oracle?
La solution
La clause OVER spécifie le partitionnement, la commande et la fenêtre « sur laquelle » la fonction analytique fonctionne.
Par exemple, cela 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 rangées de largeur) sur les rangées, classées par date.
Il 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
Elle opère sur une fenêtre qui comprend la ligne courante et toutes les lignes précédentes.
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
Elle opère sur une fenêtre qui comprend toutes les lignes d'un département particulier.
SQL Fiddle: http://sqlfiddle.com/#!4/9eecb7d/122
Autres conseils
Vous pouvez l'utiliser pour transformer des fonctions d'agrégation en analytique:
SELECT MAX(date)
FROM mytable
retournera rangée de 1
avec un seul maximum,
SELECT MAX(date) OVER (ORDER BY id)
FROM mytable
renverra toutes les lignes avec un maximum en cours d'exécution.
Il fait partie du fonctions analytiques Oracle .