如何为表中每个日期计算过去21天的销售总和?
滑动21天销售额计算方案
核心实现:窗口函数(适用于MySQL 8.0+/PostgreSQL/SQL Server等)
用滑动窗口函数可以直接实现你要的每日过去21天销售额累加,不需要手动写多个固定日期范围的查询。
直接上可用的SQL:
SELECT date AS 'Date', item, SUM(sales) OVER ( PARTITION BY item ORDER BY date RANGE BETWEEN INTERVAL 20 DAY PRECEDING AND CURRENT ROW ) AS 'Last 21 days Sales' FROM sales WHERE item = 12345 ORDER BY date;
逻辑说明
PARTITION BY item:按商品分组计算,确保不同商品的销售额不会混在一起ORDER BY date:按日期排序,保证窗口是按时间顺序滑动的RANGE BETWEEN INTERVAL 20 DAY PRECEDING AND CURRENT ROW:定义窗口范围为当前日期往前推20天(含当天),刚好是21天的周期
处理无销售记录的日期(可选)
如果你的sales表中存在某些日期没有对应销售记录(比如周末无单),但你需要这些日期也显示21天累加值,可以先生成连续日期表,再关联销售数据:
以MySQL为例:
-- 生成连续日期表(这里生成2021-03-01到2021-04-01的日期,可按需调整) WITH RECURSIVE date_range AS ( SELECT '2021-03-01' AS date UNION ALL SELECT DATE_ADD(date, INTERVAL 1 DAY) FROM date_range WHERE date < '2021-04-01' ) SELECT dr.date AS 'Date', 12345 AS item, COALESCE(SUM(s.sales) OVER ( PARTITION BY 12345 ORDER BY dr.date RANGE BETWEEN INTERVAL 20 DAY PRECEDING AND CURRENT ROW ), 0) AS 'Last 21 days Sales' FROM date_range dr LEFT JOIN sales s ON dr.date = s.date AND s.item = 12345 ORDER BY dr.date;
为什么你的原查询不行?
原查询固定了日期范围BETWEEN '2019-03-02' AND '2019-03-21',并且只返回单一行固定日期的结果,无法自动滑动计算每日的窗口范围。
内容的提问来源于stack exchange,提问作者Regan Ivins
相关产品推荐
相关产品推荐

