done
の数を数えることで、グループ化パラメータを割り当てることができます 各レコードの前にレコード。残りは単なる集計ですが、各グループに文字を割り当てるのは不必要な複雑さのように思えます:
select grp as record, min(Date) as DateBegin,
max(case when Action = 'Done' then Date end) as DateEnd,
count(*) as NumActions,
sum(case when Action = 'Escalation' then 1 else 0 end) as NumEscalations
from (select e.*, coalesce(e2.grp, 0) as grp
from example e outer apply
(select count(*) as grp
from example e2
where e2.id < e.id and e2.Action = 'Done'
) e2
) e
group by grp;
このクエリは、累積合計をサポートする SQL Server 2012 以降ではより単純 (かつ効率的) になります。
編集:
これにはサブクエリを使用していることに気付きましたが、それは必須ではありません。これは次のように記述できます:
select coalesce(grp, 0) as record, min(Date) as DateBegin,
max(case when Action = 'Done' then Date end) as DateEnd,
count(*) as NumActions,
sum(case when Action = 'Escalation' then 1 else 0 end) as NumEscalations
from example e outer apply
(select count(*) as grp
from example e2
where e2.id < e.id and e2.Action = 'Done'
) e2
group by e2.grp