聚合函数组合器
聚合函数的名称可以附加一个后缀。这改变了聚合函数的工作方式。
-If
后缀 -If 可以附加到任何聚合函数的名称上。在这种情况下,聚合函数接受一个额外的参数——条件(Uint8 类型)。聚合函数仅处理触发条件的行。如果条件没有被触发一次,它将返回一个默认值(通常是零或空字符串)。
示例: sumIf(column, cond)
、countIf(cond)
、avgIf(x, cond)
、quantilesTimingIf(level1, level2)(x, cond)
、argMinIf(arg, val, cond)
等等。
使用条件聚合函数,您可以不使用子查询和 JOIN
同时计算多个条件的聚合。例如,条件聚合函数可用于实现分段比较功能。
-Array
后缀 -Array 可以附加到任何聚合函数上。在这种情况下,聚合函数接受 'Array(T)' 类型(数组)作为参数,而不是 'T' 类型的参数。如果聚合函数接受多个参数,这些参数必须是相同长度的数组。在处理数组时,聚合函数会对所有数组元素进行像原始聚合函数一样的操作。
示例 1:sumArray(arr)
- 对所有 'arr' 数组的所有元素进行求和。在这个例子中,可以更简单地写为:sum(arraySum(arr))
。
示例 2:uniqArray(arr)
– 计算所有 'arr' 数组中唯一元素的数量。这可以通过更简单的方式完成:uniq(arrayJoin(arr))
,但并不总是可以将 'arrayJoin' 添加到查询中。
-If 和 -Array 可以组合使用。然而,'Array' 必须放在前面,然后是 'If'。示例:uniqArrayIf(arr, cond)
、quantilesTimingArrayIf(level1, level2)(arr, cond)
。由于这个顺序,'cond' 参数不会是一个数组。
-Map
后缀 -Map 可以附加到任何聚合函数上。这会创建一个聚合函数,它将 Map 类型作为参数,并使用指定的聚合函数分别聚合映射中每个键的值。结果也为 Map 类型。
示例
-SimpleState
如果您应用此组合器,聚合函数将返回相同的值,但类型不同。这是一个 SimpleAggregateFunction(...),可以存储在表中以与 AggregatingMergeTree 表一起工作。
语法
参数
x
— 聚合函数参数。
返回值
聚合函数的值,其类型为 SimpleAggregateFunction(...)
。
示例
查询:
结果:
-State
如果您应用此组合器,聚合函数不会返回最终值(例如 uniq 函数的唯一值数量),而是返回聚合的中间状态(对于 uniq
,这是用于计算唯一值数量的哈希表)。这是一个 AggregateFunction(...)
,可以用于进一步处理或存储在表中以便稍后完成聚合。
请注意,-MapState 不是对相同数据的不变,因为中间状态中数据的顺序可能会改变,尽管这不会影响该数据的摄取。
要处理这些状态,使用:
- AggregatingMergeTree 表引擎。
- finalizeAggregation 函数。
- runningAccumulate 函数。
- -Merge 组合器。
- -MergeState 组合器。
-Merge
如果您应用此组合器,聚合函数将中间聚合状态作为参数,合并状态以完成聚合,并返回结果值。
-MergeState
以与 -Merge 组合器相同的方式合并中间聚合状态。然而,它不返回结果值,而是一个中间聚合状态,类似于 -State 组合器。
-ForEach
将表的聚合函数转换为数组的聚合函数,聚合对应的数组项并返回结果数组。例如,对数组 [1, 2]
、[3, 4, 5]
和 [6, 7]
的 sumForEach
在将相应的数组项相加后返回结果 [10, 13, 5]
。
-Distinct
每个唯一参数组合只会聚合一次。重复的值会被忽略。
示例: sum(DISTINCT x)
(或 sumDistinct(x)
)、groupArray(DISTINCT x)
(或 groupArrayDistinct(x)
)、corrStable(DISTINCT x, y)
(或 corrStableDistinct(x, y)
)等。
-OrDefault
改变聚合函数的行为。
如果聚合函数没有输入值,使用此组合器它将返回其返回数据类型的默认值。适用于可以接受空输入数据的聚合函数。
-OrDefault
可以与其他组合器一起使用。
语法
参数
x
— 聚合函数参数。
返回值
如果没有任何内容可聚合,则返回聚合函数返回类型的默认值。
类型取决于使用的聚合函数。
示例
查询:
结果:
同时 -OrDefault
也可以与其他组合器结合使用。当聚合函数不接受空输入时,它是有用的。
查询:
结果:
-OrNull
改变聚合函数的行为。
此组合器将聚合函数的结果转换为 Nullable 数据类型。如果聚合函数没有值可计算,则返回 NULL。
-OrNull
可以与其他组合器一起使用。
语法
参数
x
— 聚合函数参数。
返回值
- 聚合函数的结果,转换为
Nullable
数据类型。 NULL
,如果没有任何内容可聚合。
类型: Nullable(聚合函数返回类型)
。
示例
在聚合函数的末尾添加 -orNull
。
查询:
结果:
同时 -OrNull
也可以与其他组合器结合使用。当聚合函数不接受空输入时,它是有用的。
查询:
结果:
-Resample
允许您将数据分为多个组,然后分别聚合这些组中的数据。组是通过将一列的值分割成区间来创建的。
参数
start
—resampling_key
值所需区间的起始值。stop
—resampling_key
值所需区间的结束值。整个区间不包括stop
值[start, stop)
。step
— 将整个区间分成子区间的步长。aggFunction
在每个子区间内独立执行。resampling_key
— 用于将数据分隔成区间的列。aggFunction_params
—aggFunction
参数。
返回值
- 每个子区间的
aggFunction
结果数组。
示例
考虑以下数据的 people
表:
让我们获取年龄在 [30,60)
和 [60,75)
区间内的人的姓名。由于我们使用整数表示年龄,我们将在 [30, 59]
和 [60,74]
区间内获取年龄。
要在数组中聚合姓名,我们使用 groupArray 聚合函数。它只接受一个参数。在我们的例子中,它是 name
列。groupArrayResample
函数应使用 age
列按照年龄聚合姓名。为了定义所需的区间,我们将 30, 75, 30
参数传入 groupArrayResample
函数。
考虑结果。
John
不在样本中,因为他太年轻。其他人根据指定的年龄区间被分配。
现在让我们计算指定年龄区间内的总人数和他们的平均工资。
-ArgMin
后缀 -ArgMin 可以附加到任何聚合函数的名称上。在这种情况下,聚合函数接受一个附加参数,应该是任何可比较的表达式。聚合函数仅处理具有指定额外表达式最小值的行。
示例: sumArgMin(column, expr)
、countArgMin(expr)
、avgArgMin(x, expr)
等等。
-ArgMax
与后缀 -ArgMin 类似,但仅处理具有指定额外表达式最大值的行。