Pergunta

O que é o significado da cláusula OVER no Oracle?

Foi útil?

Solução

A cláusula OVER especifica o particionamento, ordenação & janela "sobre o qual" a função analítica opera.

Por exemplo, este calcula uma média móvel:

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

Ela opera através de uma janela móvel (3 linhas de largura) sobre as linhas, ordenados por data.

Este calcula um equilíbrio em execução:

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

Ele opera sobre uma janela que inclui a linha atual e todas as linhas anteriores.

Este calcula o máximo, separadamente para cada "departamento":

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

Ele opera sobre uma janela que inclui todas as linhas para um departamento específico.

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

Outras dicas

Você pode usá-lo para transformar algumas funções agregadas em analítica:

SELECT  MAX(date)
FROM    mytable

retornará linha 1 com um único máximo,

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

retornará todas as linhas com um máximo em execução.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top