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()
.