Die Lösung von @PonderStibbons ist in Ordnung, aber da ich selbst eine erstellt habe, die nicht auf Rekursion basiert, poste ich sie auch. Beachten Sie, dass es bei anderen Datensätzen Unterschiede geben wird. Insbesondere geht diese Abfrage davon aus, dass innerhalb eines bestimmten Bereichs derselbe pkg_des
Datensätze, die Gruppe von Datensätzen mit prd_desc
BEZAHLT werden nicht durch nicht-PAID unterbrochen Werte. Dies ist keine Annahme in der rekursiven Lösung, die ein wichtiger Faktor sein könnte, um meine Lösung zu verwerfen:
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;
Die Ausgabe ist für die gegebenen Beispieldaten gleich:
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
Ich habe ein Sternchen hinzugefügt, bei dem sich die Ausgabe von dem unterscheidet, was Sie in Ihrer Frage aufgelistet haben, aber das obige ist die Ausgabe, wenn die Regeln buchstabengetreu befolgt werden.