微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle - 按先前连接

如何解决Oracle - 按先前连接

我知道我必须在此查询中使用 CONNECT BY PRIOR,但我不确定如何实现它。

我们有购买月度订阅的客户,这些客户每个月都会自动续订。我们有一个日志表,可以显示您当前的订单 ID 是什么,以及您以前的订单 ID 是什么。所以,表记录可能是这样的:

CUSTOMER ID: 1     ORDER ID: 123   PREV_ORDER_ID:       STATUS: Complete
CUSTOMER ID: 1     ORDER ID: 456   PREV_ORDER_ID: 123   STATUS: Complete
CUSTOMER ID: 1     ORDER ID: 789   PREV_ORDER_ID: 456   STATUS: Complete
CUSTOMER ID: 1     ORDER ID: 888   PREV_ORDER_ID: 789   STATUS: Complete
CUSTOMER ID: 1     ORDER ID: 999   PREV_ORDER_ID: 888   STATUS: Active

我想计算有多少客户至少连续订阅了 13 个月,并且与最近订阅没有差距的客户将处于“活动”状态。如果订阅中断,PREV_ORDER_ID 将为 NULL。

希望在查询中做到这一点,而不必为它编写匿名块。

非常感谢!

解决方法

您可以这样做(使用您的实际表名和列名,而不是查询中的 with 子句,您应该删除它)。注意层次递归是从末尾开始(从 'Active' 状态)向后进行;在我的查询中,我将它停在第 4 级,因为我不想写足够的行来达到第 13 级。当然,您必须在 where 子句中用 13 替换 4。

with
  test_data (customer_id,order_id,prev_order_id,status) as (
    select 1,123,null,'Complete' from dual union all
    select 1,456,789,888,999,'Active'   from dual union all
    select 2,100,'Complete' from dual union all
    select 2,200,'Active'   from dual union all
    select 5,105,'Complete' from dual union all
    select 5,106,205,206,'Active'   from dual
  )
select  customer_id
from    test_data
where   level = 4
start   with status = 'Active'
connect by customer_id = prior customer_id and order_id = prior prev_order_id
;

CUSTOMER_ID
-----------
          1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。