如何在KQL中按列名查找整列数据并添加至另一数据表?
KQL实现按列名匹配生成动态列表
已知两个数据表:
let A = datatable(XName:string, YName:string) [ "XData", "YData1", "XData", "YData2", ]; let B = datatable(XData:double, YData1:double, YData2:double) [ 0.0, 1.0, 2.0, 0.1, 1.1, 2.1, 0.2, 1.2, 2.2 ];
需要扩展表A,新增YValues列,值为表B中由YName指定列的所有值组成的动态列表。期望输出如下:
let DesiredOutput = datatable(XName:string, YName:string, YValues:dynamic) [ "XData", "YData1", dynamic([1.0, 1.1, 1.2]), "XData", "YData2", dynamic([2.0, 2.1, 2.2]), ];
之前尝试的代码因内部语句无法访问外部YName列而失效,以下是正确实现方式:
解决方案代码
let A = datatable(XName:string, YName:string) [ "XData", "YData1", "XData", "YData2", ]; let B = datatable(XData:double, YData1:double, YData2:double) [ 0.0, 1.0, 2.0, 0.1, 1.1, 2.1, 0.2, 1.2, 2.2 ]; // 将表B转换为键值对格式,提取列名与对应值 let B_columns_lists = B | summarize by dummy=1 // 生成单行数据,用于打包所有列 | project cols = pack_all() // 将所有列打包为属性包 | mv-apply kv = cols on ( project YName = tostring(kv.key), YValue = kv.value | where YName != "dummy" // 过滤临时生成的dummy列 | summarize YValues = make_list(YValue) by YName // 按列名聚合生成值列表 ); // 关联表A与处理后的表B,得到最终结果 A | join kind=inner B_columns_lists on YName | project XName, YName, YValues
代码说明
- 转换表B格式:通过
summarize生成单行数据,再用pack_all()把所有列打包成属性包,最后用mv-apply展开属性包的键值对,拆分出每个列名和对应的数据值。 - 生成列值列表:对拆分后的键值对按
YName分组,用make_list聚合生成该列所有值组成的动态列表。 - 关联表A:将表A与处理后的表B通过
YName列关联,保留所需列即可得到期望输出。
内容的提问来源于stack exchange,提问作者Stefan Bauer
相关产品推荐
相关产品推荐

