如何修改SQL查询筛选近6月活跃但前12月未活跃且不在指定集合的客户?
修改SQL查询以识别重新活跃的客户
我来帮你调整这个查询,刚好能精准匹配你要的「沉睡后重新活跃」客户需求~
你的核心需求是筛选出:
- 不在
$dealerNum数组内的客户 - 近6个月有订单记录
- 且在18个月前到6个月前的这段12个月窗口里,完全没有订单(也就是至少沉睡了12个月)
方案一:用EXISTS/NOT EXISTS实现(逻辑清晰,性能友好)
这种方式通过两个子查询分别验证两个核心条件,逻辑直观,数据库也容易优化:
SELECT c.customerNumber FROM Customers c WHERE c.customerNumber NOT IN ($dealerNum) -- 确认近6个月有至少一笔订单 AND EXISTS ( SELECT 1 FROM Orders o WHERE o.customerNumber = c.customerNumber AND o.orderDate BETWEEN CURRENT_DATE - 6 MONTHS AND CURRENT_DATE ) -- 确认18个月到6个月前没有任何订单 AND NOT EXISTS ( SELECT 1 FROM Orders o WHERE o.customerNumber = c.customerNumber AND o.orderDate BETWEEN CURRENT_DATE - 18 MONTHS AND CURRENT_DATE - 6 MONTHS );
方案二:用条件聚合实现(适合需额外统计的场景)
如果之后你需要同时统计两个窗口的订单数,这种分组聚合的方式会更灵活:
SELECT c.customerNumber FROM Customers c INNER JOIN Orders o ON c.customerNumber = o.customerNumber WHERE c.customerNumber NOT IN ($dealerNum) -- 只筛选最近18个月内的订单,缩小数据范围 AND o.orderDate >= CURRENT_DATE - 18 MONTHS GROUP BY c.customerNumber HAVING -- 近6个月有订单(统计数大于0) COUNT(CASE WHEN o.orderDate >= CURRENT_DATE - 6 MONTHS THEN 1 END) > 0 -- 18-6个月前没有订单(统计数等于0) AND COUNT(CASE WHEN o.orderDate BETWEEN CURRENT_DATE - 18 MONTHS AND CURRENT_DATE - 6 MONTHS THEN 1 END) = 0;
注意事项
原查询里写了C.date,这里大概率是笔误——订单日期应该来自Orders表(比如o.orderDate),记得替换成你数据库里实际的订单日期字段名,避免查询出错。
内容的提问来源于stack exchange,提问作者Geoff_S
相关产品推荐
相关产品推荐

