Jag tror att i princip samma idé gäller som i den tidigare frågan. Du vill räkna antalet färdiga poster strikt före en given färdig post. Detta ger dig en gruppidentifierare som sedan kan användas för aggregering.
I SQL Server 2012+ skulle du använda den kumulativa summafunktionen. I tidigare versioner kan du göra samma sak med en korrelerad underfråga eller yttre tillämpning.
Den här versionen modifierar ovanstående på flera sätt. I synnerhet förenklar det logiken för att definiera grp
. Jag ser inte lätt hur row_number()
passar in i frågan. Jag förstår logiken -- räkna upp de utförda åtgärderna och använd det för aggregering. Men att få det värdet på alla rader i gruppen är inte trivialt.
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;