To trochę skomplikowane. Zamiast używać rank()
lub podobne, użyj lag()
zobaczyć, kiedy coś się zmieni. Następnie wykonaj skumulowaną sumę flagi.
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;
Oto SQLFiddle.
EDYCJA:
Tu Gordon edytuje moją własną odpowiedź. Ups. Pierwotne zapytanie było 90% drogi tam. Zidentyfikował grupy gdzie liczby powinny wzrosnąć, ale nie przypisywać numerów w grupach. Zrobiłbym to z innym poziomem row_number()
jak w:
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;
Ogólna idea jest więc następująca. Najpierw użyj lag()
określić, gdzie zaczyna się grupa (to znaczy, gdzie następuje zmiana działu z jednej daty na następną). Następnie przypisz im „identyfikator grupy”, wykonując sumę skumulowaną. To są zapisy, które należy wyliczyć. Ostatnim krokiem jest ich wyliczenie za pomocą row_number()
.