Bạn có thể chỉ định một tham số nhóm bằng cách đếm số lượng done
các bản ghi trước mỗi bản ghi. Phần còn lại chỉ là tổng hợp, mặc dù việc gán một chữ cái cho mỗi nhóm có vẻ phức tạp không cần thiết:
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;
Truy vấn này sẽ đơn giản hơn (và hiệu quả hơn) trong SQL Server 2012+, hỗ trợ tính tổng tích lũy.
CHỈNH SỬA:
Tôi nhận thấy rằng tôi sử dụng một truy vấn con cho việc này, nhưng điều đó là không cần thiết. Điều này có thể được viết là:
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