Kusto按天向前填充时序缺失值 渲染SoftwareVersion计数timechart
实现方法
以下是可直接运行的KQL查询代码,完全匹配按Serial维度向前填充缺失值、1天步长统计版本数量并渲染timechart的需求:
let swVersions = datatable(Date: datetime, SoftwareVersion: string, Serial: string) [ datetime(2022-01-24T13:18:20.8450657Z), '1.29.0', '310160039', datetime(2022-01-26T06:01:41.8742421Z), '1.30.0', '310160039', datetime(2022-01-26T12:12:23.2342343Z), '1.31.0', '310160039', datetime(2022-01-28T12:10:14.3620707Z), '1.17.0', '310160039', datetime(2022-01-24T05:48:58.9000481Z), '1.29.0', '310160040', datetime(2022-01-24T10:22:23.4457354Z), '1.30.0', '310160040', datetime(2022-01-24T15:52:16.2342152Z), '1.29.0', '310160040', datetime(2022-01-25T05:48:58.9012738Z), '1.30.0', '310160040']; // 计算全量数据的日期边界 let minDate = toscalar(swVersions | summarize startofday(min(Date))); let maxDate = toscalar(swVersions | summarize startofday(max(Date))); swVersions // 按天截断时间,取每个Serial当日最后一次上报的软件版本 | summarize DayVersion = arg_max(Date, SoftwareVersion) by Serial, Date = startofday(Date) // 按Serial分区独立补全时间序列,避免不同设备数据互相干扰 | partition by Serial ( // 生成从最早日期到最晚日期的完整1天步长时间轴 make-series Version = take_any(DayVersion) default = long(null) on Date from minDate to maxDate step 1d // 对缺失日期的版本执行向前填充 | extend Version = series_fill_forward(Version) // 将时间序列数组展开为明细行 | mv-expand Date to typeof(datetime), Version to typeof(string) | project-away SeriesID ) // 过滤边缘空值(本场景无此类数据) | where isnotempty(Version) | project Date, SoftwareVersion = Version, Serial // 按日期、版本统计数量并渲染时间图 | summarize count() by Date, SoftwareVersion | render timechart
关键逻辑说明
- 时间归一:用
startofday()将原始带时分秒的上报时间统一对齐到当日0点,满足1天步长要求 - 当日版本取值:用
arg_max()取每个Serial每天最后一次上报的版本,和示例预期规则完全匹配(例如Serial 310160039在1月26日有两次上报,取当日最晚的1.31.0作为当日版本) - 分维度填充:通过
partition by Serial按序列号独立处理数据,保证每个设备的版本填充只参考自身历史上报记录 - 缺失值补全:生成完整天级时间轴后用
series_fill_forward()做向前填充,输出的明细结构和你给出的期望填充数据集完全一致
内容的提问来源于stack exchange,提问作者Alessio
相关产品推荐
相关产品推荐

