基本的には先ほどの質問と同じ考えが成り立つと思います。特定の完了レコードの前に、完了レコードの数を厳密に数えたいとします。これにより、集計に使用できるグループ ID が得られます。
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;
プレ>