web-dev-qa-db-fra.com

Clause OVER dans Oracle

Quel est le sens de la clause OVER dans Oracle?

67
paweloque

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

74
Jeffrey Kemp

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.

27
Quassnoi

Cela fait partie des fonctions analytiques Oracle .

18
cletus