2009-07-07 48 views
54

¿Cuál es el significado de la cláusula OVER en Oracle?OVER cláusula en Oracle

+0

En caso de duda, consulte el manual: http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions004.htm#SQLRF06174 –

Respuesta

60

La cláusula OVER especifica la partición, ordenando & ventana "sobre la cual" opera la función analítica.

Por ejemplo, este calcula un promedio móvil:

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 

Se opera sobre una ventana en movimiento (3 filas de ancho) sobre las filas, por fecha.

Este calcula un saldo corriente:

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 

Opera a través de una ventana que incluye la fila actual y todas las anteriores.

Esto calcula el máximo, por separado para cada "dept":

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 

que opera sobre una ventana que incluye todas las filas de un departamento particular.

SQL violín: http://sqlfiddle.com/#!4/9eecb7d/122

+0

¿Podría explicar cómo funciona OVER() cuando se usa sin argumentos? – Lamy

+3

Ningún argumento significa que abarca todo el conjunto de resultados. –

+0

¿Por qué en su primer ejemplo calcula el valor anterior de la primera fila como cero? ¿Es eso algo que puedes cambiar? – k9b

24

Se puede utilizar para transformar algunas funciones agregadas en analítica:

SELECT MAX(date) 
FROM mytable 

regresará 1 fila con un único máximo,

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

devolverá todas las filas con un máximo de funcionamiento.

+2

Haces una muy buena punto sobre la transformación de funciones agregadas en analíticas. Esa es una forma en que nunca pensé en eso. – user128216