sql >> データベース >  >> RDS >> Oracle

トランザクションテーブルから定期的なスナップショットを生成するSQL

    わかりました、これは説明するのが難しいでしょう。

    各ステータスの各日付で、次の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を使用する必要があります 最初に結果セットに行を作成します。これが要件であるかどうかは不明なので、その複雑さは省きます。




    1. レコード間の時間差

    2. Entity FrameworkのOperatorのように?

    3. スクリプトの実行後にユーザーがフォームページに入力したデータを保存するにはどうすればよいですか?

    4. 異なる(日付)を選択して同じ日付を数回返す