问题描述
正如标题所述,我想找到一种有效的方法来计算行组上的聚合而不会将这些行折叠在一起。例如,我想在下表中创建mean
列。
|------------|---------|-------------|
| category | value | mean(value) |
|------------|---------|-------------|
| A | 1 | 3 |
|------------|---------|-------------|
| A | 3 | 3 |
|------------|---------|-------------|
| A | 5 | 3 |
|------------|---------|-------------|
| B | 1 | 1.5 |
|------------|---------|-------------|
| B | 2 | 1.5 |
|------------|---------|-------------|
到目前为止,我发现最好的方法是:
T
| join kind=leftouter (T | summarize avg() by category) on category
这似乎导致性能问题。我也知道使用partition by
的方法,但是需要支持超过64个类别。
我错过了执行此任务的好方法吗?
解决方法
您在这里:
let MyTable = datatable(Category:string,value:long) [
"A",1,"A",3,5,"B",2
];
let Avgs = MyTable | summarize avg(value) by Category;
MyTable | lookup (Avgs) on Category
这将完全输出您想要的内容。
说明:
- 首先,您创建一个临时表(使用
let
语句),名为Avgs
,在其中您将获得每个类别的平均值。 - 您的主要声明是输出
MyTable
,但是对于每个类别,您还希望显示Avgs
中的相关值,这是使用lookup
运算符实现的。