Cualquier diferencia entre “fila actual” y “0 anterior / siguiente” en la cláusula de funciones analíticas de Oracle de ventanas?
Pregunta
Algunas de las funciones analíticas de Oracle permiten una cláusula de ventanas para especificar un subconjunto de la partición actual, utilizando palabras clave como "sin límites anteriores / siguiente", "fila actual", o "value_expr anterior / siguiente", donde value_expr es una física o lógica de desplazamiento de la fila actual o el valor (en función de si se ha especificado FILA o rango, respectivamente).
Aquí hay un ejemplo usando scott / tigre que muestra los empleados en el departamento 30, y un recuento del número de empleados en su departamento de contratados antes de ellos (incluidos ellos mismos):
select deptno,
empno,
hiredate,
count(*) over (partition by deptno
order by hiredate
range between unbounded preceding and current row) cnt_hired_before1,
count(*) over (partition by deptno
order by hiredate
range between unbounded preceding and 0 preceding) cnt_hired_before2
from emp
where deptno = 30
order by deptno, hiredate;
... ¿alguien puede dar un ejemplo o documentación donde "fila actual" es diferente de "0 anterior / siguiente"? Sólo parece que el azúcar sintáctica para mí ...
Solución
Realmente no importa que se utiliza. Son dos formas diferentes de expresar la ventanas, pero el optimizador llevará a cabo la consulta de la misma manera. El término "fila actual" es uno que es común a varias bases de datos con las funciones analíticas, no sólo de Oracle. Es más bien una diferencia estilística, de la misma manera que algunas personas prefieren la cuenta (*) sobre la cuenta (1).
Otros consejos
La documentación de Oracle que tengo a mano (Oracle 9.2) dice:
Si ha especificado GAMA:
- value_expr es un desplazamiento lógico. Tiene que ser una constante o expresión que se evalúa como un valor numérico positivo o un intervalo literal.
Esto implica que no se debe realmente a utilizar 0 ya que no es un valor numérico positivo. Pero, obviamente, es posible utilizar 0 anterior / siguiendo ya que eres.
Se trata de lo que estamos tratando de lograr. Es posible que desee utilizar oscilan entre / filas entre usarlo para encontrar LAST_VALUE dentro de las cosas sub-set o comparar dentro de un sub-conjunto. Pero ciertamente no es necesario para el ejemplo que nos ha facilitado.
select deptno,
empno,
hiredate,
count(*) over (partition by deptno, trunc(hiredate,'mm')) cnt_same_month
from emp
where deptno = 30
order by deptno, hiredate