Мисля, че основно същата идея е валидна като в предишния въпрос. Искате да преброите броя на направените записи стриктно преди всеки даден готов запис. Това ви дава идентификатор на група, който след това може да се използва за агрегиране.
В SQL Server 2012+ ще използвате функционалността за кумулативна сума. В по-стари версии можете да направите същото със свързана подзаявка или външно приложение.
Тази версия променя горното по няколко начина. По-специално, той опростява логиката на дефиниране на grp
. Не виждам лесно как row_number()
се вписва в заявката. Разбирам логиката - избройте извършените действия и използвайте това за агрегиране. Но получаването на тази стойност за всички редове в групата не е тривиално.
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;