KQL查询问题:无法正确计算并展示30天与24小时平均时长
KQL查询问题:24小时与30天平均时长计算异常
需求:在同一表格中以独立列展示两组平均时长——过去24小时(通过下拉菜单设置时间范围)和过去30天(查询内配置),但当前查询返回的30天平均时长未按预期填充。
原查询代码:
let raw_data = view() {(union isfuzzy=true requests, dependencies)}; let avgDuration30days = toscalar(raw_data | summarize avg(duration) by bin(todatetime(now()), 30d)); union isfuzzy=true requests, dependencies | project itemType, duration | summarize avgDuration24hrs = avg(duration) by itemType | extend avgDuration30days
问题原因
raw_data作为view会继承外部下拉菜单的24小时时间范围,导致计算30天平均时仅使用了24小时的数据,而非真正的30天全量数据。summarize avg(duration) by bin(todatetime(now()), 30d)写法无效:bin(now(),30d)仅对齐当前时间的30天边界,没有过滤数据的时间范围;且未按itemType分组,导致所有行的30天平均都是同一个错误值。
修正方案
方案1:计算全局30天平均(所有itemType共用一个值)
// 独立计算过去30天的全局平均,不受外部时间范围影响 let avgDuration30days = toscalar( union isfuzzy=true requests, dependencies | where timestamp >= datetime_add('day', -30, now()) | summarize avg(duration) ); // 处理外部时间范围(24小时)的数据,按itemType计算平均 union isfuzzy=true requests, dependencies | project itemType, duration | summarize avgDuration24hrs = avg(duration) by itemType | extend avgDuration30days
方案2:按itemType分别计算30天平均
如果需要每个itemType对应各自的30天平均,用关联查询实现:
// 预计算每个itemType过去30天的平均 let avg30days_by_type = materialize( union isfuzzy=true requests, dependencies | where timestamp >= datetime_add('day', -30, now()) | summarize avgDuration30days = avg(duration) by itemType ); // 处理24小时数据的平均,并关联30天数据 union isfuzzy=true requests, dependencies | project itemType, duration | summarize avgDuration24hrs = avg(duration) by itemType | join kind=leftouter avg30days_by_type on itemType | project itemType, avgDuration24hrs, avgDuration30days
内容的提问来源于stack exchange,提问作者vpn
相关产品推荐
相关产品推荐

