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

条件に基づいてカウンターを割り当てる方法

    @PonderStibbonsの解決策は問題ありませんが、再帰に基づいてではなく、自分で作成したので、それも投稿します。他のデータセットには違いがあることに注意してください。特に、このクエリは、同じpkg_desの指定された範囲内にあることを前提としています。 records、prd_descを持つレコードのグループ 有料 PAID以外の方法で中断されることはありません 値。これは、再帰的ソリューションで行われた仮定ではありません。これは、私のソリューションを破棄するための重要な要因になる可能性があります。

    select   reg_id, pkg_des, prd_desc, event_date, event_type_cd,
             case when prd_desc = 'PAID'
                  then greatest(0, -1+count(case when event_type_cd <> 'exp' then 1 end) 
                          over (partition by reg_id, pkg_des, prd_desc
                                order by     event_date asc
                                rows between unbounded preceding and 0 preceding)
                       )
                  else 0
             end as renewal_cnt,
             case when   lag(prd_desc) over (partition by reg_id, pkg_des
                                             order by     event_date asc) = 'PAID' 
                     and prd_desc = 'PAID'
                     and event_type_cd = 'renewal'
                  then 1 
                  else 0 
             end is_ren, 
             case when   lag(prd_desc) over (partition by reg_id, pkg_des
                                             order by     event_date asc) = 'trail'
                     and prd_desc = 'PAID'
                  then 1
                  else 0
             end is_conv
    from     temp
    order by reg_id asc,
             pkg_des desc,
             event_date asc;
    

    指定されたサンプルデータの出力は同じです:

    REG_ID | Pkg_DES | PRD_DESC | EVENT_DATE | event_type_cd | renewal_cnt | is_ren | is_conv
    -------+---------+----------+------------+---------------+-------------+--------+--------   
        1  |  CC     |  trail   | 12-12-2012 |  new sub      |       0     |     0  |   0
        1  |  CC     |  trail   | 12-13-2012 |  exp          |       0     |     0  |   0
        1  |  CC     |  PAID    | 12-14-2012 |  upsell       |       0     |     0  |   1
        1  |  CC     |  PAID    | 12-15-2012 |  exp          |       0     |     0  |   0*
        1  |  CC     |  PAID    | 12-16-2012 |  renewal      |       1     |     1  |   0
        1  |  CC     |  PAID    | 12-17-2012 |  renewal      |       2     |     1  |   0
        1  |  aa     |  trail   | 12-12-2012 |  new sub      |       0     |     0  |   0 
        1  |  aa     |  trail   | 12-13-2012 |  exp          |       0     |     0  |   0
        1  |  aa     |  PAID    | 12-14-2012 |  renewal      |       0     |     0  |   1
        1  |  aa     |  PAID    | 12-15-2012 |  renewal      |       1     |     1  |   0
        1  |  aa     |  PAID    | 12-16-2012 |  upsell       |       2     |     0* |   0 
        1  |  aa     |  PAID    | 12-17-2012 |  renewal      |       3     |     1  |   0
    

    質問に記載したものとは出力が異なるアスタリスクを追加しましたが、上記はルールが文字に準拠している場合の出力です。



    1. SQL Server(T-SQL)で失敗した電子メールを確認する

    2. MariaDBでのLPAD()のしくみ

    3. JOINクエリを使用してレコードを取得する

    4. Postgres 9.5 ON CONFLICT DO SELECT