これは少し複雑です。 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()
を使用します グループがどこから始まるか(つまり、ある日付から次の日付に部門が変わる場所)を決定します。次に、累積合計を実行して、これらに「グループID」を割り当てます。これらは列挙されるレコードです。最後のステップは、row_number()
を使用してそれらを列挙することです。 。