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

如何为表中每个日期计算过去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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:01:01