Myślę, że w zasadzie obowiązuje ten sam pomysł, co w poprzednim pytaniu. Chcesz policzyć liczbę wykonanych rekordów ściśle przed jakimkolwiek danym rekordem wykonanym. Daje to identyfikator grupy, który można następnie wykorzystać do agregacji.
W SQL Server 2012+ użyjesz funkcji sumy zbiorczej. We wcześniejszych wersjach możesz zrobić to samo ze skorelowanym podzapytaniem lub zastosowaniem zewnętrznym.
Ta wersja modyfikuje powyższe na kilka sposobów. W szczególności upraszcza logikę definiowania grp
. Nie widzę łatwo, jak row_number()
pasuje do zapytania. Rozumiem logikę — wylicz wykonane działania i użyj ich do agregacji. Ale uzyskanie tej wartości we wszystkich wierszach w grupie nie jest trywialne.
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;