Oracle
 sql >> Base de données >  >> RDS >> Oracle

Clause OVER dans Oracle

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