Cualquier diferencia entre “fila actual” y “0 anterior / siguiente” en la cláusula de funciones analíticas de Oracle de ventanas?

StackOverflow https://stackoverflow.com/questions/379643

  •  22-08-2019
  •  | 
  •  

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í ...

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top