わかりました、これは説明するのが難しいでしょう。
各ステータスの各日付で、次の2つの値をカウントする必要があります。
- そのステータスで開始する顧客の数。
- そのステータスで離れる顧客の数。
最初の値は簡単です。これは、日付とステータスによるトランザクションの集計にすぎません。
2番目の値はほぼ同じくらい簡単です。 前のを取得します ステータスコードと、そのステータスコードがその日に「離れる」回数を数えます。
次に、重要なのは、最初の値の累積合計から2番目の値の累積合計を引いたものです。
次のコードはテストされていないことを私は自由に認めます(SQL Fiddleをお持ちの場合は、喜んでテストします)。ただし、結果のクエリは次のようになります。
select status_dte, status_cd,
(sum(inc_cnt) over (partition by status_cd order by status_dt) -
sum(dec_cnt) over (partition by status_cd order by status_dt)
) as dateamount
from ((select t.status_dt, t.status_cd, count(*) as inc_cnt, 0 as dec_cnt
from transactions t
group by t.status_dt, t.status_cd
) union all
(select t.status_dt, prev_status_cd, 0, count(*)
from (select t.*
lag(t.status_cd) over (partition by t.account_id order by status_dt) as prev_status_cd
from transactions t
) t
where prev_status_cd is null
group by t.status_dt, prev_status_cd
)
) t;
1つ以上のステータスに変更がない日付がある場合および それらを出力に含めたい場合、上記のクエリはcross join
を使用する必要があります 最初に結果セットに行を作成します。これが要件であるかどうかは不明なので、その複雑さは省きます。