Du kan tilldela en grupperingsparameter genom att räkna antalet done
rekord före varje post. Resten är bara sammanställning, även om att tilldela en bokstav för varje grupp verkar vara en onödig komplikation:
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;
Den här frågan skulle vara enklare (och mer effektiv) i SQL Server 2012+, som stöder kumulativa summor.
EDIT:
Jag märker att jag använder en underfråga för detta, men det är inte nödvändigt. Detta kan skrivas som:
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