使用分析函数的下一步操作

Posted

技术标签:

【中文标题】使用分析函数的下一步操作【英文标题】:Next action using analytic functions 【发布时间】:2013-04-30 13:20:38 【问题描述】:

为了进行同期群分析,我正在尝试获取每个客户的下一步操作(取消订阅、升级、降级...)

我有一个包含以下数据的月度快照:

customer | month      | last_action   | last_action_date
1          01-01-2012   subscription    01-01-2012
1          02-01-2012   subscription    01-01-2012
1          03-01-2012   subscription    01-01-2012
1          04-01-2012   downgrade       04-01-2012
1          05-01-2012   downgrade       04-01-2012
1          06-01-2012   downgrade       04-01-2012
1          07-01-2012   unsubscription  07-01-2012

如您所见,该操作仅在完成的月份才知道,在 01-01-2012 月份,我们还不知道客户在 2012 年 4 月 1 日降级,因此我们无法分析他的相对于他降级月份的使用行为。退订也是一样。

所需的数据集如下:

customer | month      | downgrade_date   | unsubscription_date
1          01-01-2012   04-01-2012         07-01-2012
1          02-01-2012   04-01-2012         07-01-2012
1          03-01-2012   04-01-2012         07-01-2012
1          04-01-2012   12-31-9999         07-01-2012
1          05-01-2012   12-31-9999         07-01-2012
1          06-01-2012   12-31-9999         07-01-2012
1          07-01-2012   12-31-9999         07-01-2012

我可以使用 last_value 分析函数轻松获得退订日期,但没有找到获取降级日期的方法。

这是我的 SQL 查询:

SELECT month_id, 
       customer_id,
       CASE 
         WHEN LAST_VALUE(last_action) OVER (PARTITION BY customer_id ORDER BY month_id RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) = 'unsubscription' THEN LAST_VALUE(last_action_date) OVER (PARTITION BY customer_id ORDER BY month_id RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)    
         ELSE TO_DATE('99991231', 'yyyymmdd')
       END unsubscription_date
FROM my_table
;

任何获取“下一个”行动日期的方法,例如“downgrade_date”。

我正在使用 Oracle。

【问题讨论】:

查看lead() 函数。 【参考方案1】:

在 oracle 11 中,您可以使用 lead()ignore nulls 选项执行此操作:

select customer, MONTH,
       lead(case when last_action = 'downgrade' then last_action_date end ignore nulls) over
                 (partition by customer order by month desc) as downgrade_date,
       lead(case when last_action = 'unsubscription' then last_action_date end ignore nulls) over
                 (partition by customer order by month desc) as downgrade_date,
from my_table t

如果你没有ignore nulls,你可以用min()做类似的事情:

select customer, MONTH,
       min(case when last_action = 'downgrade' then last_action_date end) over
                (partition by customer order by month range between current and unbounded following
                ) as downgrade_date,
       min(case when last_action = 'unsubscription' then last_action_date end) over
                (partition by customer order by month range between current and unbounded following
                ) as unsubscription_date
from my_table t  

【讨论】:

谢谢 Gordon,min() 查询不起作用,lead 的问题是我仅在降级之前和之后的一行中获得 downgrade_date。 @user2018454 。 . .我的猜测是 lead() 查询确实可以工作,因为 Oracle 版本。 min() 是由month desc 订购的,然后将所有内容都进行到最后——这意味着它正在查看前几个月。删除desc 看看是否可行。

以上是关于使用分析函数的下一步操作的主要内容,如果未能解决你的问题,请参考以下文章

r 代码段显示了自定义的HTML表函数和示例。我的下一步是将此HTML表复制并粘贴到excel文件中,

r 代码段显示了自定义的HTML表函数和示例。我的下一步是将此HTML表复制并粘贴到excel文件中,

本地缓冲区溢出分析

CEO说 | SaaS 的下一步将变成什么?

逆向-攻防世界-maze

web浏览器调试