sql >> Base de Datos >  >> RDS >> Oracle

Funciones de Oracle Analytic:restablecimiento de una cláusula de ventana

Esto es un poco complicado. En lugar de usar rank() o similar, use lag() para ver cuando algo cambia. Luego haz una suma acumulativa de la bandera.

select dept, date1,
       CASE WHEN StartFlag = 0 THEN 1
            ELSE 1+StartFlag+NVL(lag(StartFlag) over (order by date1),0)
       END as rnk
from (select t1.*,
             (case when dept = lag(dept) over (order by date1)
                   then 1
                   else 0
              end) as StartFlag
      from t1
     ) t1
order by date1;

Aquí está el SQLFiddle.

EDITAR:

Este es Gordon editando mi propia respuesta. Ups. La consulta original fue el 90% del camino hasta allí. Identificó los grupos donde los números deberían aumentar, pero no asignó los números dentro de los grupos. Haría esto con otro nivel de row_number() como en:

select dept, date1,
       row_number() over (partition by dept, grp order by date1) as rnk
from (select dept, date1, startflag,
             sum(StartFlag) over (partition by dept order by date1) as grp
      from (select t1.*,
                   (case when dept = lag(dept) over (order by date1)
                         then 0
                         else 1
                    end) as StartFlag
            from t1
           ) t1
     ) t1
order by date1;

Entonces, la idea general es la siguiente. Primero use lag() para determinar dónde comienza un grupo (es decir, dónde hay un cambio de departamento de una fecha a la siguiente). Luego, asigne una "identificación de grupo" a estos, haciendo una suma acumulativa. Estos son los registros que se van a enumerar. El paso final es enumerarlos usando row_number() .