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

SQL Server不使用循环计算15分钟时间窗口内value列聚合差值的实现方案

解决方案

完全可以通过单次分组聚合实现需求,无需循环,性能远高于逐窗口查询的实现。

核心实现代码

-- 定义参数
DECLARE @startTimeInput BIGINT = 1636329609000; -- 替换为实际查询起始时间戳
DECLARE @endTimeInput BIGINT = 1636331379000; -- 替换为实际查询结束时间戳
DECLARE @windowMilliseconds BIGINT = 15 * 60 * 1000; -- 15分钟对应的毫秒数

-- 窗口聚合查询
SELECT
    MIN([Timestamp]) AS start_time,
    MAX([Timestamp]) AS end_time,
    ROUND(MAX(value) - MIN(value), 2) AS value
FROM PLANT1.DATA_TABLE ts
WHERE ts.unixTime >= @startTimeInput AND ts.unixTime <= @endTimeInput
-- 按15分钟窗口分桶,需要按点位拆分统计则把logicalId加入GROUP BY和SELECT列表
GROUP BY (ts.unixTime - @startTimeInput) / @windowMilliseconds
-- 可选:如果需要对齐到整点15分钟刻度(00:00、00:15、00:30等),替换上面的分组逻辑为:
-- GROUP BY ts.unixTime / @windowMilliseconds
ORDER BY start_time;

逻辑说明

  1. 核心思路是通过时间戳计算每个数据点所属的15分钟窗口编号,相同编号的数属于同一个时间窗口
  2. 仅需对符合条件的数据做一次全量扫描,按计算出的窗口编号分组聚合即可得到结果,避免了循环逐窗口查询的多次表扫描开销,时间跨度越大性能优势越明显
  3. 与原有循环逻辑的输出完全一致:样例数据中第一个窗口差值为1535.3-1527.6=7.7,第二个窗口差值为1543.3-1528.6=7.8,和预期结果匹配

优化建议

如果表数据量较大,建议给unixTime列建立非聚集索引,包含Timestamp、value、logicalId字段,可进一步提升查询速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:24:03