如何关联至最近的较早日期:MachineTimes与SessionList表关联需求
问题:匹配最近的较早机器累计运行时长数据
现有两张表:
- MachineTimes:非每日更新,
CumulativeTimes字段表示截至对应TimeStamp的机器累计运行时长(单位:小时) - SessionList:包含
SerialNumber(设备序列号)、SessionId(会话ID)以及各会话的StartTime(会话开始时间)
需要将两张表基于TimeStamp与StartTime关联,匹配到可用的最近的较早日期的累计时长,但当前写法仅能匹配日期完全一致的情况,无匹配时会返回空白,代码如下:
let CumulativeTimes_Query = MachineTimes | extend StartTime2 = format_datetime(TimeStamp,'yy-MM-dd'); let age_of_machine = SessionList | distinct SerialNumber, SessionId, StartTime2 = format_datetime(TimeStamp,'yy-MM-dd') | join kind=inner CumulativeTimes_Query on StartTime2, SerialNumber | project SerialNumber, SessionId, CumulativeTimes;
解决方案
采用leftouter join结合summarize arg_max()的方式,找到每个会话对应的最近的较早日期累计记录:
// 处理MachineTimes,提取日期起始点 let MachineTimesWithDate = MachineTimes | extend RecordDate = startofday(TimeStamp); // 处理SessionList,提取会话日期起始点 let SessionListWithDate = SessionList | extend SessionDate = startofday(StartTime); // 关联并筛选最近的较早记录 SessionListWithDate | join kind=leftouter MachineTimesWithDate on SerialNumber | where RecordDate <= SessionDate // 只保留早于/等于会话日期的累计记录 | summarize arg_max(RecordDate, CumulativeTimes) by SerialNumber, SessionId // 取每个会话对应的最新的有效累计记录 | project SerialNumber, SessionId, CumulativeTimes
方案说明:
- 用
startofday()提取日期的起始时刻,避免因时分秒差异导致的匹配误差 - 使用
leftouter join确保所有会话记录都能被保留,不会因无完全匹配日期而丢失 - 通过
where过滤出累计记录日期早于或等于会话日期的条目 - 用
summarize arg_max()按设备和会话分组,筛选出每个组内日期最新的累计记录,对应的CumulativeTimes即为所需的最近较早时长
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

