summarize 运算符

生成可聚合输入表内容的表。

Sales | summarize NumTransactions=count(), Total=sum(UnitPrice * NumUnits) by Fruit, StartOfMonth=startofmonth(SellDateTime)

返回一个表,其中包含销售交易数目和每种水果每个销售月份的总金额。 输出列显示交易数目、交易价值、水果、以及记录了交易的月份开始时的日期/时间。

T | summarize count() by price_range=bin(price, 10.0)

此表显示每个价格区间([0,10.0]、[10.0,20.0] 等)内的项数。 此示例中有一列表示计数,还有一列表示价格范围。 忽略所有其他输入列。

语法

T| summarize [SummarizeParameters] [[Column=] Aggregation [, ...]] [by [Column=] GroupExpression [, ...]]

参数

  • Column:结果列的可选名称。 默认为派生自表达式的名称。

  • 聚合:聚合函数(例如 count()avg())的调用,以列名作为参数。

  • GroupExpression:一个可以引用输入数据的标量表达式。 所有组表达式有多少个不同的值,输出就会包含多少个记录。

  • SummarizeParameters:零个或更多(以空格分隔)Name=Value 形式的参数,用于控制行为。 支持以下参数:

    名称 描述
    hint.num_partitions 指定用于在群集节点上共享查询负载的分区数。 请参阅随机执行查询
    hint.shufflekey=<key> shufflekey 查询使用键将数据分区,在群集节点上共享查询负载。 请参阅 shuffle 查询
    hint.strategy=shuffle shuffle 策略查询会在群集节点上共享查询负载,其中的每个节点将处理一个数据分区。 请参阅 shuffle 查询

注意

当输入表为空时,输出取决于是否使用了 GroupExpression:

  • 如果未提供 GroupExpression,则输出将为单个(空)行。
  • 如果提供了 GroupExpression,则输出将不包含任何行。

返回

输入行将排列成与 by 表达式具有相同值的组。 然后,对每个组计算指定的聚合函数,从而为每组生成行。 结果包含 by 列,还至少包含用于每个计算聚合的一列。 (某些聚合函数返回多个列。)

结果有许多行,因为 by 值(可能为零)存在不同的组合。 如果未提供任何组键,则结果将包含单个记录。

若要基于数值范围进行汇总,请使用 bin() 将范围减小为离散值。

注意

  • 尽管可为聚合和分组表达式提供任意表达式,但使用简单列名称或将 bin() 应用于数值列会更加高效。
  • 不再支持自动地每小时对日期/时间列进行分箱。 请改用显式分箱。 例如 summarize by bin(timestamp, 1h)

对默认值进行聚合

下表汇总了聚合的默认值:

运算符 默认值
count(), countif(), dcount(), dcountif() 0
make_bag(), make_bag_if(), make_list(), make_list_if(), make_set(), make_set_if() 空的动态数组 ([])
所有其他 null

对包含 null 值的实体使用这些聚合时,null 值会被忽略,并且不会参与计算(请参阅下面的示例)。

示例

按水果和供应商汇总价格。

唯一组合

确定表中有 ActivityTypeCompletionStatus 的哪些唯一组合。 没有聚合函数,只是有分组依据键。 输出将只显示这些结果的列:

Activities | summarize by ActivityType, completionStatus

输出

ActivityType completionStatus
dancing started
singing started
dancing abandoned
singing completed

最小和最大时间戳

查找 Activities 表中所有记录的最小和最大时间戳。 没有 group by 子句,因此输出中只有一行:

Activities | summarize Min = min(Timestamp), Max = max(Timestamp)

输出

Min Max
1975-06-09 09:21:45 2015-12-24 23:45:00

非重复计数

为每个大陆创建一行,并显示发生活动的城市的计数。 由于“continent”的值很少,因此“by”子句中不需要使用任何分组函数:

Activities | summarize cities=dcount(city) by continent

输出

cities continent
4290 Asia
3267 Europe
2673 North America

直方图

下面的示例将计算每个活动类型的直方图。 由于 Duration 有许多值,因此请使用 bin 将其值按 10 分钟的间隔分组:

Activities | summarize count() by ActivityType, length=bin(Duration, 10m)

输出

count_ ActivityType length
354 dancing 0:00:00.000
23 singing 0:00:00.000
2717 dancing 0:10:00.000
341 singing 0:10:00.000
725 dancing 0:20:00.000
2876 singing 0:20:00.000
...

对默认值进行聚合

summarize 运算符的输入至少有一个空的分组依据键时,其结果也将为空。

如果 summarize 运算符的输入没有空的分组依据键,则结果将是在 summarize 中使用的聚合的默认值:

datatable(x:long)[]
| summarize any_x=take_any(x), arg_max_x=arg_max(x, *), arg_min_x=arg_min(x, *), avg(x), buildschema(todynamic(tostring(x))), max(x), min(x), percentile(x, 55), hll(x) ,stdev(x), sum(x), sumif(x, x > 0), tdigest(x), variance(x)

输出

any_x arg_max_x arg_min_x avg_x schema_x max_x min_x percentile_x_55 hll_x stdev_x sum_x sumif_x tdigest_x variance_x
NaN 0 0 0 0

avg_x(x) 的结果为 NaN,因为被除以 0。

datatable(x:long)[]
| summarize  count(x), countif(x > 0) , dcount(x), dcountif(x, x > 0)

输出

count_x countif_ dcount_x dcountif_x
0 0 0 0
datatable(x:long)[]
| summarize  make_set(x), make_list(x)

输出

set_x list_x
[] []

聚合平均值运算会对所有非 null 值求和,只计算参与计算的那些值(不会将 null 值考虑在内)。

range x from 1 to 2 step 1
| extend y = iff(x == 1, real(null), real(5))
| summarize sum(y), avg(y)

输出

sum_y avg_y
5 5

常规计数会将 null 计在内:

range x from 1 to 2 step 1
| extend y = iff(x == 1, real(null), real(5))
| summarize count(y)

输出

count_y
2
range x from 1 to 2 step 1
| extend y = iff(x == 1, real(null), real(5))
| summarize make_set(y), make_set(y)

输出

set_y set_y1
[5.0] [5.0]