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