错误SQL修复:查询任意12个月周期内下单2次的member_id
原语句错误原因
- 分组统计时使用
COUNT(t1.order_id)统计的是用户的累计总订单数,和关联t2表时加的12个月时间限制完全没有关联,所以最终返回的是所有累计下单≥2次的用户,和需求不符。 - LEFT JOIN的使用也多余,这里需要匹配到符合时间窗口的关联订单,用INNER JOIN更合适。
正确实现方案
方案1:修改自关联逻辑
不需要分组聚合,只要匹配到任意两个符合12个月间隔的订单即可:
SELECT DISTINCT t1.member_id FROM orders t1 INNER JOIN orders t2 ON t1.member_id = t2.member_id AND t2.order_id <> t1.order_id -- 排除自身订单匹配 AND t2.date_paid BETWEEN DATE_SUB(t1.date_paid, INTERVAL 12 MONTH) AND t1.date_paid;
方案2:滑动窗口函数(性能更优,适合大数据量场景)
通过滑动窗口直接统计每个订单对应的前12个月累计订单数,只要有一个窗口满足条件即可:
SELECT DISTINCT member_id FROM ( SELECT member_id, COUNT(order_id) OVER ( PARTITION BY member_id ORDER BY UNIX_TIMESTAMP(date_paid) RANGE BETWEEN 31536000 PRECEDING AND CURRENT ROW -- 12个月对应的秒数,滑动时间窗口 ) AS cnt_12m FROM orders ) t WHERE cnt_12m >= 2;
内容的提问来源于stack exchange,提问作者Dizz
相关产品推荐
相关产品推荐

