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

如何修改TSQL查询,在CTE中实现当前日期前3条记录的求和?

修改TSQL查询以计算当前日期前3条记录的总和

嗨,我来帮你搞定这个TSQL查询的修改需求!你需要在现有基于当前记录之前所有数据聚合的基础上,额外计算当前日期之前的前3条记录的总和,对吧?

首先先看你当前的查询:

SELECT 
    date,
    value,
    SUM(value) OVER(ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS total_before_all
FROM details
ORDER BY date;

这个查询能算出当前记录之前所有历史数据的总和,但要加前3条的求和,我们可以利用窗口函数的范围控制来实现,精准指定只取当前行之前的最近3条记录(即使前面不足3条也不会出错,会自动取现有所有前置记录)。

修改后的查询如下:

SELECT 
    date,
    value,
    -- 保留原有的:当前记录之前所有数据的总和
    SUM(value) OVER(ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS total_before_all,
    -- 新增的:当前记录之前的前3条记录的总和
    SUM(value) OVER(ORDER BY date ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING) AS total_before_last_3
FROM details
ORDER BY date;

关键逻辑说明:

  • ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING 这个子句专门锁定当前行的前3行到前1行的范围,也就是当前记录之前的最近3条数据。比如当前是第4条记录,就取前1-3条;如果是第2条,就只取前1条,完全不用额外处理边界情况。
  • 原有聚合字段total_before_all保持不变,新增的total_before_last_3字段就能满足你要的前3条求和需求。

举个实际数据的例子,假设你的details表有这些数据:

datevalue
2024-01-0110
2024-01-0220
2024-01-0330
2024-01-0440
2024-01-0550

运行修改后的查询,得到的结果会是:

datevaluetotal_before_alltotal_before_last_3
2024-01-0110NULLNULL
2024-01-02201010
2024-01-03303030
2024-01-04406060
2024-01-055010090

这样就完美实现了你要的两个聚合需求啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:19:56