Giải pháp của @PonderStibbons là tốt, nhưng vì tôi đã tự tạo một giải pháp, không dựa trên đệ quy, tôi cũng đăng nó. Lưu ý rằng sẽ có sự khác biệt đối với các tập dữ liệu khác. Đáng chú ý, truy vấn này giả định rằng trong một phạm vi nhất định có cùng pkg_des
bản ghi, nhóm bản ghi có prd_desc
ĐÃ TRẢ TIỀN không bị gián đoạn bởi không TRẢ TIỀN các giá trị. Đây không phải là một giả định được thực hiện trong giải pháp đệ quy, có thể là một yếu tố quan trọng để loại bỏ giải pháp của tôi:
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;
Đầu ra giống nhau đối với dữ liệu mẫu đã cho:
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
Tôi đã thêm một dấu sao ở đó đầu ra khác với những gì bạn đã liệt kê trong câu hỏi của mình, nhưng ở trên là đầu ra khi các quy tắc được tuân theo đối với chữ cái.