Решението на @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
Добавих звездичка, където изходът е различен от това, което изброихте във вашия въпрос, но горното е изходът, когато правилата се следват докрай.