如何在Kusto中合并同表多计算列结果,按userId聚合展示?
问题
我正在尝试在Kusto中展示数据,但遇到了问题。目前我有三个可正常运行的查询:
MyTable1 | where data contains "Books" and page contains "page1" and metricType contains "Count" | summarize arg_max_value_books = arg_max(value, *) by userId, data | extend data, userId, booksCount= arg_max_value_books | project data, userId, booksCount
该查询返回如下结果,Tools和Cars的查询逻辑类似:
Data | userId | booksCount ---------------------------------------- Books | 12312 | 4 Books | 51341 | 3 Books | 12245 | 0
MyTable1 | where data contains "Tools" and page contains "page1" and metricType contains "Count" | summarize arg_max_value_tools = arg_max(value, *) by userId, data | extend data, userId, toolsCount= arg_max_value_tools | project data, userId, toolsCount
Data | userId | toolsCount ---------------------------------------- Tools| 12312 | 10 Tools| 51341 | 30 Tools| 12245 | 5
MyTable1 | where data contains "Cars" and page contains "page1" and metricType contains "Count" | summarize arg_max_value_cars = arg_max(value, *) by userId, data | extend data, userId, carsCount= arg_max_value_cars | project data, userId, carsCount
我需要将这些结果合并,得到如下格式的数据:
userId | toolsCount | booksCount | carsCount ---------------------------------------------------------------- 12312 | 10 | 4 | 0 51341 | 30 | 3 | 2 12245 | 5 | 0 | 12
不确定应该使用merge、join、自连接还是其他方法,且网上多数示例都是与其他表连接,并非我需要的同表合并场景。
解决方法
不需要多次查询同一张表,也不用复杂的join操作,直接通过一次过滤+pivot函数就能实现需求,效率更高。
完整查询如下:
MyTable1 // 一次筛选出所有需要的数据类型,减少后续处理量 | where data in ("Books", "Tools", "Cars") and page contains "page1" and metricType contains "Count" // 按用户和数据类型分组,取每个分组的最新value值 | summarize latest_value = arg_max(value, *) by userId, data // 将data列的不同取值转成独立列,自动完成合并 | pivot data, any(latest_value) // 重命名列名匹配需求格式 | rename any_Books to booksCount, any_Tools to toolsCount, any_Cars to carsCount // 给缺失计数的用户补0,确保格式统一 | extend booksCount = coalesce(booksCount, 0), toolsCount = coalesce(toolsCount, 0), carsCount = coalesce(carsCount, 0) // 按userId排序(可选操作) | sort by userId
逻辑说明:
- 一次过滤:用
data in ("Books", "Tools", "Cars")替代三次单独的contains,一次性筛选出所有目标数据,避免重复扫描表。 - 分组取最新值:通过
summarize arg_max(value, *) by userId, data,实现和你之前三个查询完全一致的逻辑——获取每个用户每种数据类型的最新value。 - pivot转列:
pivot函数直接将data的不同取值转成独立列,自动完成多组数据的合并,比多次join操作更简洁高效。 - 补0处理:用
coalesce函数把缺失的计数(比如某用户没有Cars类型的数据)填充为0,保证结果格式统一。
内容的提问来源于stack exchange,提问作者SomeoneLearning17
相关产品推荐
相关产品推荐

