@PonderStibbons का समाधान ठीक है, लेकिन जैसा कि मैंने खुद बनाया था, रिकर्सन पर आधारित नहीं, मैं इसे भी पोस्ट करता हूं। ध्यान दें कि अन्य डेटा सेट के लिए अंतर होगा। विशेष रूप से, यह क्वेरी मानती है कि समान pkg_des
. की दी गई सीमा के भीतर रिकॉर्ड, रिकॉर्ड का समूह prd_desc
. के साथ भुगतान किया गैर-भुगतान . द्वारा बाधित नहीं हैं मूल्य। यह पुनरावर्ती समाधान में की गई धारणा नहीं है, जो मेरे समाधान को त्यागने का एक महत्वपूर्ण कारक हो सकता है:
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
मैंने एक तारांकन जोड़ा है जहां आउटपुट आपके प्रश्न में सूचीबद्ध से अलग है, लेकिन उपरोक्त आउटपुट है जब पत्र में नियमों का पालन किया जाता है।