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

T-SQL按1分钟间隔计算平均值、最大值异常问题咨询

问题原因与解决方案

你遇到的问题很典型——AVG(1)和MAX(1)之所以一直返回1,是因为你在对常量1做计算,而不是对每个分钟的记录数做统计。

为什么原来的写法不对?

  • AVG(1):每个分组里的每一行都会被当作数值1,假设某个分钟有10条记录,那总和就是10*1=10,平均值就是10/10=1,不管分组大小,结果永远是1。
  • MAX(1):同样是取常量1的最大值,自然也只会返回1。

你真正需要的是:先按分钟分组计算每个时段的记录数,再对这些记录数求平均和最大值。

修正后的SQL示例

这里用CTE(公共表表达式)先算出每个分钟的记录数,再基于这些数据统计平均值和最大值:

WITH MinuteLevelCounts AS (
    -- 先按完整的分钟时间分组,避免不同日期同时间段被合并
    SELECT 
        DATEADD(minute, DATEDIFF(minute, 0, timestamp), 0) AS minute_start,
        COUNT(1) AS minute_total
    FROM [history]
    WHERE timestamp BETWEEN '2018-04-16 14:00:00.707' AND '2018-04-18 15:00:00.707'
    GROUP BY DATEADD(minute, DATEDIFF(minute, 0, timestamp), 0)
)
-- 方式1:展示每个分钟的记录数,同时附带整体的平均和最大值
SELECT
    FORMAT(minute_start, 'hh:mm') AS tm,
    minute_total AS current_minute_count,
    (SELECT AVG(minute_total) FROM MinuteLevelCounts) AS avg_occurrences,
    (SELECT MAX(minute_total) FROM MinuteLevelCounts) AS max_occurrences
FROM MinuteLevelCounts;

-- 方式2:直接输出整体的平均、最大和总记录数
/*
SELECT
    AVG(minute_total) AS avg_occurrences,
    MAX(minute_total) AS max_occurrences,
    SUM(minute_total) AS overall_total
FROM MinuteLevelCounts;
*/

额外提醒

如果你坚持用FORMAT(timestamp, 'hh:mm')分组,会把不同日期的同一小时分钟合并(比如4月16日14:00和4月17日14:00会被算作一组),这通常不是按分钟统计的预期结果,所以建议用DATEADD+DATEDIFF的方式获取精确的分钟起始时间来分组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:53:18