You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

监控工具后端报表查询日可用性平均值时出现多值问题求助

解决每日可用性查询返回多个平均值的问题

看起来你遇到的情况是查询返回了每个节点每日的可用性平均值(比如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天的不同日期。建议调整输出格式,把日期和平均值对应展示,避免多行结果合并到一行造成误解:

SummaryDateNodeNameAVERAGE_of_Availability
2017-12-10Manila81%
2017-12-15Subic91%
2017-12-16Subic85%
2017-12-17Subic28%
2017-12-12Laguna85%

另外,你原来的日期转换代码可以简化,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

火山引擎 最新活动