使用Kusto KQL按ID填充字段空值为最近已知值
问题描述
现有一主表,其中ID为1、2的X列存在空值,表格如下:
| ID | DateTime | IngestionTime | X | Y | Z |
|---|---|---|---|---|---|
| 1 | 2012-12-28T12:04:00 | 2012-12-28T12:04:00 | 12 | 11 | 10 |
| 2 | 2012-12-28T12:06:00 | 2012-12-28T12:06:00 | 2 | 9 | 7 |
| 3 | 2012-12-29T12:11:00 | 2012-12-29T12:11:00 | 2 | 9 | 7 |
| 1 | 2012-12-29T12:15:00 | 2012-12-29T12:15:00 | 33 | 7 | |
| 2 | 2012-12-29T12:24:00 | 2012-12-29T12:24:00 | 9 | 7 |
已定义函数demo(datetime:fromTime, datetime:toTime),查询时间范围为2012-12-29T12:11:00至当日,需将空值替换为对应ID的最近已知字段值,预期结果如下:
| ID | DateTime | IngestionTime | X | Y | Z |
|---|---|---|---|---|---|
| 1 | 2012-12-28T12:04:00 | 2012-12-28T12:04:00 | 12 | 11 | 10 |
| 2 | 2012-12-28T12:06:00 | 2012-12-28T12:06:00 | 2 | 9 | 7 |
| 3 | 2012-12-29T12:11:00 | 2012-12-29T12:11:00 | 2 | 9 | 7 |
| 1 | 2012-12-29T12:15:00 | 2012-12-29T12:15:00 | 对应ID的最近已知值? | 33 | 7 |
| 2 | 2012-12-29T12:24:00 | 2012-12-29T12:24:00 | 对应ID的最近已知值? | 9 | 7 |
解决方案
可以使用**向前填充(Forward Fill)**逻辑,结合按ID分组、时间排序的方式实现空值替换。以Kusto查询语言为例,通过partition by和prev()函数即可完成需求:
demo(datetime(2012-12-29T12:11:00), datetime(2012-12-29T23:59:59)) | partition by ID ( order by DateTime asc | extend X = coalesce(X, prev(X)) // 若存在连续空值,可重复调用prev()或使用scan运算符处理 )
核心逻辑说明
partition by ID:按ID分组,确保每个ID的填充值仅来自自身的历史数据order by DateTime asc:按时间升序排列,保证取到的是最近的已知值coalesce(X, prev(X)):若当前X为空,则取上一行的X值;若存在连续空值,可重复此步骤或使用scan运算符批量处理
内容的提问来源于stack exchange,提问作者Kameshwaran R
相关产品推荐
相关产品推荐

