监控工具后端报表查询日可用性平均值时出现多值问题求助
解决每日可用性查询返回多个平均值的问题
看起来你遇到的情况是查询返回了每个节点每日的可用性平均值(比如Subic对应3个不同日期的结果),大概率是分组逻辑和你预期的需求不匹配,我来帮你拆解分析:
问题原因解析
你的SQL语句是按SummaryDate(提取后的每日日期)和NodeName双重分组的,这会让查询返回每个节点每一天的可用性平均值。从你的示例输出看,Subic有3个值,说明在你指定的时间范围(SQL Server日期值43094到43125,对应2017年底到2018年初左右)内,这个节点有3天的可用性数据,所以生成了3条每日平均值结果;而其他节点可能只有1天的数据,所以只显示一个值。
如果你的实际需求是每个节点在整个时间段内的总平均值,而非每日细分值,那问题就出在多余的日期分组上。
针对性解决方案
方案1:获取每个节点的总平均值(全时间段)
去掉日期相关的分组和查询字段,只按节点分组即可:
SELECT Nodes.Caption AS NodeName, AVG(DailyNodeAvailability.Availability) AS AVERAGE_of_Availability FROM Nodes INNER JOIN DailyNodeAvailability ON (Nodes.NodeID = DailyNodeAvailability.NodeID) WHERE ( DateTime BETWEEN 43094 AND 43125 ) GROUP BY Nodes.Caption ORDER BY Nodes.Caption ASC
这样每个节点只会返回一个全时间段的平均结果,和你示例中Manila、Laguna的单值展示逻辑一致。
方案2:确认每日平均值的正确性(保留每日分组)
如果你确实需要每日的细分平均值,那当前查询的逻辑是没问题的——Subic的3个值对应3天的不同日期。建议调整输出格式,把日期和平均值对应展示,避免多行结果合并到一行造成误解:
| SummaryDate | NodeName | AVERAGE_of_Availability |
|---|---|---|
| 2017-12-10 | Manila | 81% |
| 2017-12-15 | Subic | 91% |
| 2017-12-16 | Subic | 85% |
| 2017-12-17 | Subic | 28% |
| 2017-12-12 | Laguna | 85% |
另外,你原来的日期转换代码可以简化,SQL Server里直接用CAST(DateTime AS DATE)就能提取日期部分,可读性更高,修改后的每日分组查询:
SELECT CAST(DateTime AS DATE) AS SummaryDate, Nodes.Caption AS NodeName, AVG(DailyNodeAvailability.Availability) AS AVERAGE_of_Availability FROM Nodes INNER JOIN DailyNodeAvailability ON (Nodes.NodeID = DailyNodeAvailability.NodeID) WHERE ( DateTime BETWEEN 43094 AND 43125 ) GROUP BY CAST(DateTime AS DATE), Nodes.Caption ORDER BY SummaryDate ASC
总结
- 要总平均值:去掉日期分组,仅按节点分组即可
- 要每日平均值:当前逻辑正确,调整输出格式展示对应日期即可避免混淆
内容的提问来源于stack exchange,提问作者sandy blaza




