如何在Kusto中用变量引用列列表实现summarize汇总?
用变量引用列列表实现KQL汇总统计的可行方案
问题背景
需要通过变量引用列列表实现KQL的summarize分组统计,而非逐个指定列。
原始工作代码
let data = datatable(Category: string, Category2: string) [ 'A', 'X', 'A', 'X', 'A', 'X', 'B', 'Y', 'B', 'Y', 'B', 'Y', 'B', 'Y', 'C', 'Z', 'C', 'Z', 'C', 'Z', 'C', 'Z', 'C', 'T' ]; data | summarize count() by Category, Category2
错误尝试及报错
尝试用pack_array定义列列表直接分组,代码如下:
let data = datatable(Category: string, Category2: string) [ 'A', 'X', 'A', 'X', 'A', 'X', 'B', 'Y', 'B', 'Y', 'B', 'Y', 'B', 'Y', 'C', 'Z', 'C', 'Z', 'C', 'Z', 'C', 'Z', 'C', 'T' ]; let columns = pack_array('Category', 'Category2'); data | summarize count() by columns
运行报错:
Summarize group key '' is of a 'dynamic' type. Please use an explicit cast (for example, 'summarize ... by tostring()') as grouping by a 'dynamic' type is not supported.
可行解决方案
KQL不支持直接用动态数组作为summarize by的参数,但可以通过以下两种方法实现需求:
方法1:用make_tuple打包列后分组再展开
let data = datatable(Category: string, Category2: string) [ 'A', 'X', 'A', 'X', 'A', 'X', 'B', 'Y', 'B', 'Y', 'B', 'Y', 'B', 'Y', 'C', 'Z', 'C', 'Z', 'C', 'Z', 'C', 'Z', 'C', 'T' ]; let columns = dynamic(['Category', 'Category2']); data | extend group_key = make_tuple(*columns) | summarize count() by group_key | evaluate bag_unpack(group_key)
- 逻辑:先将指定列打包成元组作为临时分组键,完成统计后再用
bag_unpack将元组展开为原始列。
方法2:用pack打包成动态对象后分组再展开
let data = datatable(Category: string, Category2: string) [ 'A', 'X', 'A', 'X', 'A', 'X', 'B', 'Y', 'B', 'Y', 'B', 'Y', 'B', 'Y', 'C', 'Z', 'C', 'Z', 'C', 'Z', 'C', 'Z', 'C', 'T' ]; let columns = dynamic(['Category', 'Category2']); data | extend group_bag = pack(columns) | summarize count() by group_bag | evaluate bag_unpack(group_bag)
- 逻辑:将指定列打包成动态键值对对象,按对象分组统计后,再展开对象为原始列。
补充说明
如果需要更灵活的动态查询场景(比如列列表来自外部输入),还可以通过字符串拼接生成KQL语句,再用execute操作符执行,但上述两种方法更适合常规场景。
内容的提问来源于stack exchange,提问作者Clerk
相关产品推荐
相关产品推荐

