【问题标题】:Dynamic summarize without column name不带列名的动态汇总
【发布时间】:2022-08-18 19:21:36
【问题描述】:

如何根据列的字符串数组动态构造汇总语句?

deviceTelemetry 
| summarize <FOR-EACH-COLUMNS>avg(column)<FOR-EACH-COLUMNS> by deviceId

编辑

这是一个数据集,\"keys\" 包含我想在汇总聚合中使用的列名,\"deviceTelemetry\" 是预期结果(在这种情况下,列是硬编码的)。

let deviceTelemetry = datatable (deviceId:guid, timestamp:datetime, value:dynamic)[
\'fddf1cec-16db-4461-9057-3d08e46b6bcf\',\'2020-05-15 17:01:35.7750000\', dynamic({ \"level\":  60}),
\'fddf1cec-16db-4461-9057-3d08e46b6bcf\',\'2020-05-15 18:01:35.7750000\', dynamic({ \"level\":  50}),
\'aaaaaaaa-fed4-c23b-422b-e85e0877c092\',\'2020-05-15 17:01:35.7750000\', dynamic({ \"level\": 100, \"flow\": 350}),
\'aaaaaaaa-fed4-c23b-422b-e85e0877c092\',\'2020-05-15 18:01:35.7750000\', dynamic({ \"level\":  90, \"flow\": 360}),
\'aaaaaaaa-fed4-c23b-422b-e85e0877c092\',\'2020-05-15 19:01:35.7750000\', dynamic({ \"level\":  80, \"flow\": 370}),
\'aaaaaaaa-fed4-c23b-422b-e85e0877c092\',\'2020-05-15 20:01:35.7750000\', dynamic({ \"level\":  70, \"flow\": 380}),
\'cb04ccff-48bc-4108-9d16-7d7db9152895\',\'2020-05-15 21:01:35.7750000\', dynamic({ \"pressure\":  120}),
\'cb04ccff-48bc-4108-9d16-7d7db9152895\',\'2020-05-15 20:01:35.7750000\', dynamic({ \"pressure\":  130}),
\'cb04ccff-48bc-4108-9d16-7d7db9152895\',\'2020-05-15 21:01:35.7750000\', dynamic({ \"pressure\":  140}),
];
let keys = deviceTelemetry
| summarize make_bag(value)
| extend keys=bag_keys(bag_value)
| mv-expand keys
| distinct tostring(keys);
keys;
let flowColumnName = \"flow\";
let levelColumnName = \"level\";
let pressureColumnName = \"pressure\";
deviceTelemetry
| evaluate  bag_unpack(value)
| summarize
            level=avg(toreal(column_ifexists(levelColumnName, levelColumnName))), 
            flow=avg(toreal(column_ifexists(flowColumnName, flowColumnName))),
            pressure=avg(toreal(column_ifexists(pressureColumnName, pressureColumnName)))
            by timestamp=bin(timestamp , 1d) , deviceId
  • 请添加数据样本,最好作为数据表

标签: azure-data-explorer kql


【解决方案1】:

pivot 插件

let deviceTelemetry = datatable (deviceId:guid, timestamp:datetime, value:dynamic)[
'fddf1cec-16db-4461-9057-3d08e46b6bcf','2020-05-15 17:01:35.7750000', dynamic({ "level":  60}),
'fddf1cec-16db-4461-9057-3d08e46b6bcf','2020-05-15 18:01:35.7750000', dynamic({ "level":  50}),
'aaaaaaaa-fed4-c23b-422b-e85e0877c092','2020-05-15 17:01:35.7750000', dynamic({ "level": 100, "flow": 350}),
'aaaaaaaa-fed4-c23b-422b-e85e0877c092','2020-05-15 18:01:35.7750000', dynamic({ "level":  90, "flow": 360}),
'aaaaaaaa-fed4-c23b-422b-e85e0877c092','2020-05-15 19:01:35.7750000', dynamic({ "level":  80, "flow": 370}),
'aaaaaaaa-fed4-c23b-422b-e85e0877c092','2020-05-15 20:01:35.7750000', dynamic({ "level":  70, "flow": 380}),
'cb04ccff-48bc-4108-9d16-7d7db9152895','2020-05-15 21:01:35.7750000', dynamic({ "pressure":  120}),
'cb04ccff-48bc-4108-9d16-7d7db9152895','2020-05-15 20:01:35.7750000', dynamic({ "pressure":  130}),
'cb04ccff-48bc-4108-9d16-7d7db9152895','2020-05-15 21:01:35.7750000', dynamic({ "pressure":  140}),
];
deviceTelemetry
| mv-expand kind=array value
| extend k = tostring(value[0]), v = toreal(value[1])
| extend timestamp_bin = bin(timestamp , 1d)
| evaluate pivot(k, avg(v),  timestamp_bin, deviceId)
timestamp_bin deviceId flow level pressure
2020-05-15T00:00:00Z fddf1cec-16db-4461-9057-3d08e46b6bcf NaN 55 NaN
2020-05-15T00:00:00Z aaaaaaaa-fed4-c23b-422b-e85e0877c092 365 85 NaN
2020-05-15T00:00:00Z cb04ccff-48bc-4108-9d16-7d7db9152895 NaN NaN 130

Fiddle

【讨论】:

    猜你喜欢
    • 2018-11-05
    • 2021-01-08
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多