You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何关联至最近的较早日期: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

方案说明:

  1. 用startofday()提取日期的起始时刻,避免因时分秒差异导致的匹配误差
  2. 使用leftouter join确保所有会话记录都能被保留,不会因无完全匹配日期而丢失
  3. 通过where过滤出累计记录日期早于或等于会话日期的条目
  4. 用summarize arg_max()按设备和会话分组,筛选出每个组内日期最新的累计记录,对应的CumulativeTimes即为所需的最近较早时长

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:17:39