Domanda

Qual è il significato della clausola OVER in Oracle?

È stato utile?

Soluzione

La clausola OVER specifica il partizionamento, ordinare e finestra "sulla quale" la funzione analitica opera.

Ad esempio, questo calcola una media 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

Si opera in un cristallo mobile (larga 3 righe) sulle righe, ordinati per data.

Questa calcola un saldo corrente:

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

Si opera su una finestra che include la riga corrente e tutte le righe precedenti.

Questo calcola la massima, separatamente per ogni "reparto":

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

Si opera su una finestra che contiene tutte le righe per un particolare reparto.

SQL Fiddle: http://sqlfiddle.com/#!4/9eecb7d/122

Altri suggerimenti

Si può usare per trasformare alcune funzioni di aggregazione in analitica:

SELECT  MAX(date)
FROM    mytable

tornerà fila 1 con un solo massimo,

SELECT  MAX(date) OVER (ORDER BY id)
FROM    mytable

restituirà tutte le righe con un massimo in esecuzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top