Question

Quel est le sens de la clause OVER dans Oracle?

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top