实现支持动态列名的宽表转长表函数wide_to_long
优化KQL宽表转长表的wide_to_long函数实现
优化后的简洁实现
let wide_to_long = (T:(*), id_vars: dynamic) { // 计算需要转换为长表的度量列(排除指定的id列) let measure_cols = set_difference(toscalar(T | getschema | summarize make_list(ColumnName)), id_vars); T // 仅打包需要转换的度量列,避免冗余操作 | extend measures = pack(measure_cols) // 按数组格式展开键值对 | mv-expand kind=array measures // 提取变量名和对应值 | extend variable = measures[0], value = measures[1] // 移除临时列,按指定顺序输出结果列 | project-away measures | project id_vars, variable, value };
优化亮点
- 减少冗余操作:直接通过
pack(measure_cols)打包需要转换的列,替代原方案中pack_all后再删除id列的繁琐步骤,逻辑更清晰 - 固定列顺序:通过
project id_vars, variable, value明确指定输出列的顺序,彻底解决原代码结果列序随机的问题 - 性能更优:省去了两次打包、拆包及键值移除的操作,减少了中间计算开销
示例验证
使用题目中的输入表测试:
let T_wide = datatable(name: string, timestamp: datetime, A: int, B: int) [ 'abc','2022-01-01 12:00:00',1,2, 'def','2022-01-01 13:00:00',3,4 ]; wide_to_long(T_wide, dynamic(['name', 'timestamp']))
输出结果完全符合期望,列顺序为name、timestamp、variable、value,无随机问题。
内容的提问来源于stack exchange,提问作者actual_panda
相关产品推荐
相关产品推荐

