ADX/Kusto:限制evaluate时,替代pivot/bag_unpack实现行转列的方案
解决方案:使用条件聚合实现行转列(无需
evaluate) 如果系统限制使用evaluate运算符,可以通过条件聚合手动实现行转列,核心逻辑是按Timestamp分组,为String列的每个可能值创建对应的聚合列。
示例代码
let table = datatable(Timestamp:datetime, String: string, Value:int)[ datetime(2023-02-09 06:54:55.280), "Column A", 10, datetime(2023-02-09 06:54:55.280), "Column B" , 11, datetime(2023-02-09 06:54:55.280), "Column C", 12, datetime(2023-02-09 06:55:55.280), "Column A", 20, datetime(2023-02-09 06:55:55.280), "Column B" , 21, datetime(2023-02-09 06:55:55.280), "Column C", 22 ] ; table | summarize ["Column A"] = take_anyif(Value, String == "Column A"), ["Column B"] = take_anyif(Value, String == "Column B"), ["Column C"] = take_anyif(Value, String == "Column C") by Timestamp
关键说明
- 用
summarize按Timestamp分组,确保同一时间戳的记录被聚合为一行 - 每个目标列通过
take_anyif实现:仅当String值匹配列名时,提取对应的Value,和原pivot中take_any的逻辑完全一致 - 若
String列的取值是固定的,该方法可完全替代evaluate pivot;若取值是动态的,因系统限制evaluate无法自动生成动态列,只能提前枚举所有可能的列名
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

