Det her er lidt kompliceret. I stedet for at bruge rank()
eller lignende, brug lag()
at se, hvornår noget ændrer sig. Lav derefter en kumulativ sum af flaget.
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;
Her er SQLFiddle.
EDIT:
Dette er Gordon, der redigerer mit eget svar. Ups. Den oprindelige forespørgsel var 90 % af vejen dertil. Det identificerede grupperne hvor tallene skulle stige, men tildelte ikke tallene inden for grupperne. Jeg ville gøre dette med et andet niveau af row_number()
som i:
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;
Så den overordnede idé er følgende. Brug først lag()
for at bestemme, hvor en gruppe begynder (det vil sige, hvor der er et afdelingsskifte fra den ene dato til den næste). Tildel derefter et "gruppe-id" til disse ved at lave en kumulativ sum. Det er de optegnelser, der skal opregnes. Det sidste trin er at opregne dem ved hjælp af row_number()
.