首页 > 解决方案 > 在 Azure 数据资源管理器中使用 Kusto 查询中的先前值填充空字段

问题描述

背景

我们在 Azure 数据资源管理器中有一个具有以下格式的数据集。

感应器 时间戳 价值
阀门1 24-03-2021 123
阀门1 23-03-2021 234
气缸速度 23-03-2021 1.2
阀门状态 23-03-2021 打开
阀门状态 24-03-2021 关闭
气缸速度 25-03-2021 2

不同的传感器具有不同的报告间隔,有的每秒报告一次,有的每天报告几次。

通过使用此查询

datatable (sourcetimestamp: datetime, sensorid:string, value:dynamic)
    [datetime(2021-03-23), "valve1", 123,
    datetime(2021-03-24), "valve1", 234,
    datetime(2021-03-23), "cylinderspeed", 1.2,
    datetime(2021-03-23), "valvestatus", "open",
    datetime(2021-03-24), "valvestatus", "closed",
    datetime(2021-03-25), "cylinderspeed", 2]
| summarize average=any(value) by bin(sourcetimestamp, 1s), sensorid
| evaluate pivot(sensorid, any(average))

我可以生成这张表

时间戳 阀门1 气缸速度 阀门状态
23-03-2021 123 1,2 打开
24-03-2021 234 关闭
25-03-2021 2

问题

如何继续执行上述查询,以便使用该列中的前一个值填充空单元格?

标签: azure-data-explorerkql

解决方案


您可以使用 series_fill 函数之一,例如series_fill_forward。请注意,让数组填充的最简单方法是使用make-series运算符

因为 timeseries 需要系列中的数值,所以我将 Valvestatus 的枚举转换为加倍。

datatable (sourcetimestamp: datetime, sensorid:string, value:dynamic)
[datetime(2021-03-23), "valve1", 123, 
datetime(2021-03-24), "valve1", 234, 
datetime(2021-03-23), "valvestatus", "open",
datetime(2021-03-24), "valvestatus", "closed",
datetime(2021-03-23), "cylinderspeed", 1.2,
datetime(2021-03-24), "cylinderspeed", 2]
| extend value = case(value=="open", double(1), value=="closed", double(0), value)
| make-series values = any(value) default=double(null) on sourcetimestamp from(datetime(2021-03-23 00:00:00.0000000)) to(datetime(2021-03-24 00:00:00.0000000)) step 1h by sensorid
| extend values = series_fill_forward(values)

推荐阅读