To je trochu komplikované. Místo použití rank()
nebo podobně, použijte lag()
vidět, když se něco změní. Poté sečtěte kumulativní součet příznaku.
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;
Zde je SQLFiddle.
EDIT:
Toto je Gordon, který upravuje moji vlastní odpověď. Jejda. Původní dotaz byl z 90 % tam. Identifikoval skupiny kde by se měla čísla zvyšovat, ale nepřiřadil čísla v rámci skupin. Udělal bych to s jinou úrovní row_number()
jako v:
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;
Celková myšlenka je tedy následující. Nejprve použijte lag()
určit, kde skupina začíná (tj. kde dochází ke změně oddělení od jednoho data k dalšímu). Poté jim přiřaďte „id skupiny“ provedením kumulativního součtu. Toto jsou záznamy, které mají být vyčísleny. Posledním krokem je jejich výčet pomocí row_number()
.