Kusto 查询获取不为空的最新列值(对于每列)

Dal*_*šić 2 kql azure-data-explorer

解释我想要完成的事情的最简单方法是用这个例子:

let data = datatable(id:int, b:string, c:string, dateTime:datetime)
[
    1,"","c one","2021-03-03",
    2,"b one","","2021-03-04",
    3,"","c two","2021-03-05"
];
Run Code Online (Sandbox Code Playgroud)

如您所见,每行都存在iddate值。bc列的值是可选的。目标是在一行中获取每列的最新值(当该值不为空时)。结果应如下所示:

3, "b one", "c two", "2021-03-05"

在实际场景中,有更多的列,我想知道是否可以以简单的方式完成它,而无需编写太多查询。

小智 6

假设数据有您定义的顺序 - 您可以使用 arg_max() 聚合: https ://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/arg-max-aggfunction

let data = datatable(id:int, b:string, c:string, dateTime:datetime)
[
    1,"","c one","2021-03-03",
    2,"b one","","2021-03-04",
    3,"","c two","2021-03-05"
];
['data']
| serialize n = row_number()
| summarize arg_max(iif(isnotnull(id), n, -1), id),
            arg_max(iif(isnotempty(b), n, -1), b),
            arg_max(iif(isnotempty(c), n, -1), c),
            arg_max(iif(isnotnull(dateTime), n, -1), dateTime)
| project-away max_*
Run Code Online (Sandbox Code Playgroud)