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

SQL Server 如何查询统计每分钟的计数器增量数值

解决方案

实现思路

  • 先对所有记录按分钟维度做时间截断,为每条记录归属对应的分钟区间
  • 筛选出每个分钟区间内时间最晚的计数器数值,单分钟仅保留1条记录,大幅缩减后续计算的数据量,避免溢出问题
  • 通过LAG窗口函数获取上一分钟的末尾计数器值,与当前分钟值做差得到增量
  • 按时间倒序输出即可匹配你需要的结果格式

参考SQL(支持窗口函数的数据库通用,以MySQL为例)

假设你的原始表名为device_counter,包含两个核心列:

  • counter_val:持续递增的计数器数值
  • record_time:记录插入的时间(datetime类型,若为秒级UNIX时间戳可参考下方适配说明)
WITH minute_last_counter AS (
    -- 提取每分钟最后一条计数器记录
    SELECT
        DATE_FORMAT(record_time, '%Y-%m-%d %H:%i') AS minute_tag,
        counter_val
    FROM (
        SELECT
            record_time,
            counter_val,
            -- 按分钟分组,组内按时间倒序排序,取第一条就是该分钟最后一条记录
            ROW_NUMBER() OVER (
                PARTITION BY DATE_FORMAT(record_time, '%Y-%m-%d %H:%i') 
                ORDER BY record_time DESC
            ) AS rank_num
        FROM device_counter
    ) t
    WHERE rank_num = 1
)
-- 计算每分钟增量
SELECT
    (current_min.counter_val - LAG(current_min.counter_val, 1, current_min.counter_val) OVER (ORDER BY current_min.minute_tag)) AS increment,
    current_min.minute_tag
FROM minute_last_counter current_min
ORDER BY minute_tag DESC;

适配说明

如果你的原始时间存储为秒级UNIX时间戳,只需将所有DATE_FORMAT(record_time, '%Y-%m-%d %H:%i')替换为FROM_UNIXTIME(FLOOR(ts/60)*60, '%Y-%m-%d %H:%i')即可,其中ts为你的时间戳列名。

溢出问题原因说明

之前出现溢出大概率是未预先过滤每个分钟的唯一记录,直接对全量原始数据开窗或做自关联,数据量过大导致内存负载过高。本方案先做了一层数据收敛,每个分钟仅保留1条记录,后续计算数据量缩小了几个量级,可完全避免溢出问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 11:45:03