Das ist etwas kompliziert. Anstatt rank()
zu verwenden oder ähnliches, verwenden Sie lag()
um zu sehen, wann sich etwas ändert. Machen Sie dann eine kumulative Summe des Flags.
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;
Hier ist die SQLFiddle.
BEARBEITEN:
Dies ist Gordon, der meine eigene Antwort bearbeitet. Hoppla. Die ursprüngliche Abfrage war zu 90 % auf dem Weg dorthin. Es identifizierte die Gruppen wo die Nummern steigen sollten, aber die Nummern innerhalb der Gruppen nicht vergeben. Ich würde dies mit einer anderen Ebene von row_number()
tun wie in:
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;
Die Gesamtidee ist also die folgende. Verwenden Sie zuerst lag()
um zu bestimmen, wo eine Gruppe beginnt (d. h. wo es von einem Datum zum nächsten einen Abteilungswechsel gibt). Weisen Sie diesen dann eine "Gruppen-ID" zu, indem Sie eine kumulative Summe erstellen. Dies sind die Datensätze, die aufgezählt werden sollen. Der letzte Schritt besteht darin, sie mit row_number()
aufzuzählen .