La solución de @PonderStibbons está bien, pero como yo mismo hice una, no basada en recursividad, también la publico. Tenga en cuenta que habrá diferencias para otros conjuntos de datos. En particular, esta consulta asume que dentro de un rango dado del mismo pkg_des
registros, el grupo de registros con prd_desc
PAGADO no son interrumpidos por no PAGO valores. Esta no es una suposición hecha en la solución recursiva, lo que podría ser un factor importante para descartar mi solución:
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;
La salida es la misma para los datos de muestra dados:
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
Agregué un asterisco donde el resultado es diferente de lo que enumeró en su pregunta, pero lo anterior es el resultado cuando se siguen las reglas al pie de la letra.