如何修改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表有这些数据:
| date | value |
|---|---|
| 2024-01-01 | 10 |
| 2024-01-02 | 20 |
| 2024-01-03 | 30 |
| 2024-01-04 | 40 |
| 2024-01-05 | 50 |
运行修改后的查询,得到的结果会是:
| date | value | total_before_all | total_before_last_3 |
|---|---|---|---|
| 2024-01-01 | 10 | NULL | NULL |
| 2024-01-02 | 20 | 10 | 10 |
| 2024-01-03 | 30 | 30 | 30 |
| 2024-01-04 | 40 | 60 | 60 |
| 2024-01-05 | 50 | 100 | 90 |
这样就完美实现了你要的两个聚合需求啦!
内容的提问来源于stack exchange,提问作者user3904868
相关产品推荐
相关产品推荐

