基于KQL计算设备工作时长及获取当前状态的问题
KQL计算设备工作时长并获取当前状态解决方案
问题分析
现有查询因仅过滤状态切换记录、未保留设备最新状态记录,导致arg_max只能返回True,无法获取设备当前实际状态。
解决方案思路
- 筛选所有状态切换的记录(当前行状态与上一行不同),同时保留每个设备的最新一条记录(无论状态是否切换);
- 基于状态切换记录计算设备运行时段的时长;
- 单独提取每个设备的最新状态,与时长结果关联。
具体KQL代码
test | order by Id, Timestamp asc // 对比当前行与上一行的状态 | extend prev_Value = prev(Value) // 保留状态切换记录或设备的第一条记录 | where prev_Value != Value or prev_Value is null // 追加每个设备的最新记录,确保当前状态被保留 | union ( test | summarize arg_max(Timestamp, *) by Id ) | order by Id, Timestamp asc // 获取下一条记录的时间和状态,用于计算运行时长 | extend next_Timestamp = next(Timestamp), next_Value = next(Value) // 仅计算从运行(True)到停机(False)的时段时长 | where Value == true and next_Value == false | project Id, 运行开始时间=Timestamp, 运行结束时间=next_Timestamp, 工作时长=next_Timestamp - Timestamp // 关联设备当前状态 | join kind=leftouter ( test | summarize 当前时间=arg_max(Timestamp, *).Timestamp, 当前状态=arg_max(Timestamp, *).Value by Id ) on Id
代码说明
prev(Value):识别状态切换节点,筛选出真正的状态变化记录;union追加最新记录:确保设备当前处于运行/停机状态时,该状态能被捕获;next(Timestamp):匹配运行状态对应的下一个停机时间,准确计算单次工作时长;- 最后通过
join关联最新状态查询结果,解决原查询无法获取当前状态的问题。
内容的提问来源于stack exchange,提问作者z3nth10n
相关产品推荐
相关产品推荐

