如何编写SQL查询筛选标记为Churn且无后续活动的客户
精准筛选永久流失(无后续活动记录)的Churn客户
需求梳理
需要筛选出同时满足以下两个条件的客户:
- 账户曾被标记为
Activity_Flag='Churn' - 在标记Churn之后,业务表中没有任何后续活动记录(自动排除标记Churn后仍有活跃/非活跃记录的客户)
解决方案SQL示例
假设业务表名为 customer_activity,核心字段包括:customer_id(客户唯一ID)、activity_date(活动发生日期)、activity_flag(活动类型标记)。以下是实现查询的SQL代码:
WITH customer_last_churn AS ( -- 提取每个客户最后一次被标记为Churn的日期 SELECT customer_id, MAX(activity_date) AS last_churn_date FROM customer_activity WHERE activity_flag = 'Churn' GROUP BY customer_id ) SELECT clc.customer_id, clc.last_churn_date FROM customer_last_churn clc -- 左关联原表,检查Churn日期后是否存在任何活动记录 LEFT JOIN customer_activity ca ON clc.customer_id = ca.customer_id AND ca.activity_date > clc.last_churn_date -- 仅保留无后续活动的客户 WHERE ca.customer_id IS NULL;
逻辑说明
- 子查询
customer_last_churn:聚合每个客户最后一次被标记为Churn的时间,确保以最新的流失标记为节点判断后续行为。 - 左关联+空值过滤:通过左关联原表,筛选出Churn日期之后没有任何活动记录的客户——若关联后
ca.customer_id为NULL,说明该客户在流失标记后未产生任何业务数据。 - 自动排除非目标客户:
- 标记Churn后有活跃记录的客户(如ID123):会关联到后续的活跃记录,因此被排除
- 标记Churn后有非活跃记录的客户(如ID321):同样会关联到后续记录,因此被排除
- 仅标记Churn后无任何后续记录的客户会被保留
场景适配调整
如果业务需要以首次Churn标记为判断节点,只需将子查询中的MAX(activity_date)替换为MIN(activity_date)即可。
内容的提问来源于stack exchange,提问作者ctjanalytics
相关产品推荐
相关产品推荐

