1. 聚合函数组合器
聚合函数的名称可以附加一个后缀。 这改变了聚合函数的工作方式。
If
Array
ForEach
OrDefault
OrNull
Resample
State
Merge
MergeState
2. 创建测试表
1 | -- 创建雇员表 |
3. If
-If 可以加到任何聚合函数之后。
加了-If之后聚合函数需要接受一个额外的参数,一个条件(Uint8类型),如果条件满足,那聚合函数处理当前的行数据,
如果不满足,那返回默认值(通常是0或者空字符串)。
使用条件聚合函数,您可以一次计算多个条件的聚合,而无需使用子查询和
JOIN例如,在Yandex.Metrica,条件聚合函数用于实现段比较功能。sumIf(column, cond)
1 | -- |
- avgIf(x, cond)
1 | select avgIf(sal,sal>2000) from emp; |
4. Array
- -Array后缀可以附加到任何聚合函数。
- 在这种情况下,聚合函数采用的参数
Array(T)类型(数组)而不是T类型参数。 - 如果聚合函数接受多个参数,则它必须是长度相等的数组。
- 在处理数组时,聚合函数的工作方式与所有数组元素的原始聚合函数类似。
- 任何聚合函数都可以通过增加后缀 Array, 来使原来的参数类型 T 变为新的参数类型 Array(T)。
如果和 -If 组合,Array 必须先来,然后 If. 例: uniqArrayIf(arr, cond), quantilesTimingArrayIf(level1, level2)(arr, cond)。由于这个顺序,该 cond 参数不会是数组。
示例1:
示例2:
sumArray(arr)对 Arrays 中的所有元素进行求和,即 sum(arraySum(arr))。
1 |
|
-If和-Array可以组合使用,但是 Array 必须在前,If 在后。
1 | -- sumArrayIf |
5. -ForEach
将对 table 使用的聚合函数,转换为对数组的聚合函数。对数组的每一项进行处理,返回一个结果数组。
1 | with (array(1,2,3) ,array(4,5,6)) as a |
6. -OrDefault
- xxxOrDefault(x)
如果聚合函数没有输入值,则使用此组合器它返回其返回数据类型的默认值。 适用于可以采用空输入数据的聚合函数。
-OrDefault 可与其他组合器一起使用。
语法
1 | SELECT avg(number), avgOrDefault(number) FROM numbers(0) |
7. -OrNull
语法
1 | SELECT sumOrNull(number), toTypeName(sumOrNull(number)) FROM numbers(10) WHERE number > 10; |
8. -Resample
xxxResample(start, end, step)(
, resampling_key) 允许您将数据划分为组,然后单独聚合这些组中的数据。 通过将一列中的值拆分为间隔来创建组。
参数
start—resampling_key开始值。stop—resampling_key结束边界。 区间内部不包含stop值,即[start, stop).step— 分组的步长。 TheaggFunction在每个子区间上独立执行。resampling_key— 取样列,被用来分组.aggFunction_params—aggFunction参数。
返回值
aggFunction每个子区间的结果,结果为数组。
示例
考虑一下 people 表具有以下数据的表结构:
1 | -- 将工资从 1000 到 400 的人分组,分组工资间隔为 1000 |
9. State
返回的不是结果值,返回的是中间状态。 这个是与 AggregatingMergeTree 来配合使用的。
如果应用此combinator,则聚合函数不会返回结果值(例如唯一值的数量 uniq 函数),但是返回聚合的中间状态(对于 uniq,返回的是计算唯一值的数量的哈希表)。 这是一个 AggregateFunction(...) 可用于进一步处理或存储在表中以完成稍后的聚合。
要使用这些状态,请使用:
- AggregatingMergeTree 表引擎。
- finalizeAggregation 功能。
- runningAccumulate 功能。
- -Merge combinator
- -MergeState combinator
10. Merge
聚合函数会把中间状态会为参数,进行 Merge,来完成聚合,返回最终的结果值。
如果应用此组合器,则聚合函数将中间聚合状态作为参数,组合状态以完成聚合,并返回结果值。
11. MergeState
与 -Merge 类似,但是返回的不是结果值,而是类似于 -State 的中间状态。
以与-Merge 相同的方式合并中间聚合状态。 但是,它不会返回结果值,而是返回中间聚合状态,类似于-State。