Това е малко сложно. Вместо да използвате rank()
или други подобни, използвайте lag()
да видим кога нещо се промени. След това направете кумулативна сума на флага.
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;
Ето SQLFiddle.
РЕДАКТИРАНЕ:
Това е Гордън, който редактира моя собствен отговор. Опа! Първоначалната заявка беше 90% от пътя до там. Той идентифицира групите където числата трябва да се увеличат, но не са присвоили номерата в рамките на групите. Бих направил това с друго ниво на row_number()
както в:
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;
И така, общата идея е следната. Първо използвайте lag()
за да се определи къде започва група (тоест къде има смяна на отдел от една дата на друга). След това задайте „идентификатор на групата“ за тях, като направите кумулативна сума. Това са записите, които трябва да бъдат изброени. Последната стъпка е да ги изброите с помощта на row_number()
.