You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:16:02