Tôi nghĩ về cơ bản ý tưởng giống như trong câu hỏi trước đó. Bạn muốn đếm số lượng bản ghi đã hoàn thành trước bất kỳ bản ghi đã hoàn thành nào. Điều này cung cấp cho bạn một số nhận dạng nhóm sau đó có thể được sử dụng để tổng hợp.
Trong SQL Server 2012+, bạn sẽ sử dụng chức năng tính tổng tích lũy. Trong các phiên bản trước đó, bạn có thể làm điều tương tự với truy vấn con có liên quan hoặc áp dụng bên ngoài.
Phiên bản này sửa đổi phần trên của bạn theo một số cách. Đặc biệt, nó đơn giản hóa logic của việc xác định grp
. Tôi không dễ dàng thấy cách row_number()
phù hợp với truy vấn. Tôi hiểu logic - liệt kê các hành động đã thực hiện và sử dụng nó để tổng hợp. Tuy nhiên, việc nhận được giá trị đó trên tất cả các hàng trong nhóm là không hề nhỏ.
SELECT r.Key, a.CYCLE_BEGIN_DATE, a.CYCLE_END_DATE, a.NUM_ACTIONS_IN_CYCLE
FROM Records r LEFT OUTER JOIN
(select a.key, a2.grp, min(Date) as CYCLE_BEGIN_DATE,
max(case when Action = 'Done') then Date end) as CYCLE_END_DATE,
count(*) as NUM_ACTIONS_IN_CYCLE
from actions a outer apply
(select count(*) as grp
from actions a2
where a2.key = a.key and a2.date < a.date and a2.action = 'Done'
) a2
group by a.key, a2.grp
) a
on r.key = a.key;