如何编写查询语句识别连续6个月每月下单≥250美元的账户
没问题,我来帮你搞定这个需求!要找出连续6个月每月消费至少250美元的账户,咱们可以分几步来实现,下面是具体的方案——我会用主流SQL语法(像PostgreSQL、MySQL 8.0+、SQL Server 2012+都支持)来演示,你可以根据自己的数据库做小调整:
第一步:按月聚合并过滤达标账户的月消费
首先,我们需要把每个账户每个月的订单金额汇总起来,只保留那些月消费总额≥250美元的记录。这一步能帮我们排除掉那些某一个月没达标、根本不可能满足连续6个月条件的月份数据。
WITH monthly_spending AS ( SELECT account_id, -- 按数据库调整写法:PostgreSQL用DATE_TRUNC,MySQL用DATE_FORMAT(order_date, '%Y-%m-01'),SQL Server用DATEFROMPARTS(YEAR(order_date), MONTH(order_date), 1) DATE_TRUNC('month', order_date) AS order_month, SUM(order_amount) AS total_spent FROM orders GROUP BY account_id, DATE_TRUNC('month', order_date) HAVING SUM(order_amount) >= 250 )
第二步:用窗口函数标记连续的月份区间
接下来,我们需要识别出哪些月份是连续的。核心思路是:给每个账户的达标月份按时间排序,然后计算「当前月份的数值 - 该月份的排序序号」——如果月份是连续的,这个计算结果会保持一致,我们可以用这个值作为分组依据。
, consecutive_groups AS ( SELECT account_id, order_month, -- 跨年度连续月份也能正确计算:比如2023-12到2024-01,转化为数值后差值会保持一致 DATE_PART('year', order_month) * 12 + DATE_PART('month', order_month) - ROW_NUMBER() OVER (PARTITION BY account_id ORDER BY order_month) AS group_key FROM monthly_spending )
*小提示:MySQL可以把DATE_PART换成YEAR(order_month)*12 + MONTH(order_month),SQL Server用YEAR(order_month)*12 + MONTH(order_month)即可。
第三步:筛选出连续6个月及以上的账户
最后,我们按账户和group_key分组,统计每组的月份数量,只要数量≥6,就说明这个账户有一段连续6个月达标的记录。最后去重得到符合条件的账户列表即可。
SELECT DISTINCT account_id FROM consecutive_groups GROUP BY account_id, group_key HAVING COUNT(*) >= 6 ORDER BY account_id;
额外补充
- 如果你的数据库不支持CTE(比如MySQL 5.x及更早版本),可以把上面的CTE换成嵌套子查询,逻辑完全一致,只是可读性稍差。
- 如果你需要返回更多信息(比如连续达标的起始/结束月份、这段时间的总消费),可以在最后一步的SELECT里加上
MIN(order_month) AS consecutive_start, MAX(order_month) AS consecutive_end, SUM(total_spent) AS total_consecutive_spent。 - 确保你的
order_date是标准日期类型,避免因格式问题导致分组错误。
内容的提问来源于stack exchange,提问作者13ISPaulGeorge
相关产品推荐
相关产品推荐

