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

如何用SQL查询任意30天周期内累计消费满3000英镑的客户

任意30天周期消费满3000英镑客户查询方案

原有代码的局限性

你现有实现仅固定查询当前日期往前30天这一个时间窗口的消费数据,无法覆盖历史上所有滚动30天的时间周期。要适配任意30天周期的需求,核心是遍历每个客户所有可能的30天窗口,计算每个窗口的累计消费,筛选出有任意窗口达标3000英镑的客户。

实现方案

方案1:通用自连接写法(兼容所有主流SQL数据库)

适合小数据量场景,对数据库版本无特殊要求:

SELECT DISTINCT t1.customer_id
FROM transaction_table t1
-- 关联同客户、交易日期在当前记录日期往后30天内的所有交易
INNER JOIN transaction_table t2
  ON t1.customer_id = t2.customer_id
  AND t2.transaction_date BETWEEN t1.transaction_date AND t1.transaction_date + INTERVAL '30 days'
-- 按客户+窗口起始日期分组,计算每个30天窗口的累计消费
GROUP BY t1.customer_id, t1.transaction_date
HAVING SUM(t2.spend) >= 3000;

说明:DISTINCT用于去重,避免同一个客户有多个达标窗口时重复返回

方案2:窗口函数高效写法(适配PostgreSQL/Spark SQL/BigQuery等支持范围窗口的数据库)

适合大数据量场景,性能远优于自连接写法:

SELECT DISTINCT customer_id
FROM (
  SELECT 
    customer_id,
    -- 按客户分区、交易日期排序,计算每个日期往后30天的滚动累计消费
    SUM(spend) OVER (
      PARTITION BY customer_id 
      ORDER BY transaction_date
      RANGE BETWEEN INTERVAL '0 days' PRECEDING AND INTERVAL '30 days' FOLLOWING
    ) AS rolling_30d_spend
  FROM transaction_table
) t
WHERE rolling_30d_spend >= 3000;

语法适配提示

不同数据库的日期间隔语法存在差异,可根据实际使用的数据库调整:

  • MySQL:将INTERVAL '30 days'替换为INTERVAL 30 DAY,日期加30天写法为DATE_ADD(t1.transaction_date, INTERVAL 30 DAY)
  • SQL Server:日期加30天写法为DATEADD(day, 30, t1.transaction_date)

内容的提问来源于stack exchange,提问作者SRJCoding

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:45:05