如何用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
相关产品推荐
相关产品推荐

