Jeg tror grundlæggende, at den samme idé gælder som i det tidligere spørgsmål. Du ønsker at tælle antallet af færdige poster strengt før en given færdig post. Dette giver dig en gruppe-id, som derefter kan bruges til aggregering.
I SQL Server 2012+ ville du bruge den kumulative sum funktionalitet. I tidligere versioner kan du gøre det samme med en korreleret underforespørgsel eller ydre ansøgning.
Denne version ændrer din ovenstående på flere måder. Især forenkler det logikken i at definere grp
. Jeg kan ikke nemt se hvordan row_number()
passer ind i forespørgslen. Jeg forstår logikken -- opregn de udførte handlinger og brug det til aggregering. Men at få denne værdi på alle rækkerne i gruppen er ikke-trivielt.
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;