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

如何编写查询语句识别连续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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:08:57