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
相关产品推荐
相关产品推荐

