AggregateFunction(name, types_of_arguments…)

聚合函数的中间状态,可以通过聚合函数名称加-State后缀的形式得到它。与此同时,当您需要访问该类型的最终状态数据时,您需要以相同的聚合函数名加-Merge后缀的形式来得到最终状态数据。

AggregateFunction — 参数化的数据类型。

参数

  • 聚合函数名

    1. 如果函数具备多个参数列表,请在此处指定其他参数列表中的值。
  • 聚合函数参数的类型

示例

  1. CREATE TABLE t
  2. (
  3. column1 AggregateFunction(uniq, UInt64),
  4. column2 AggregateFunction(anyIf, String, UInt8),
  5. column3 AggregateFunction(quantiles(0.5, 0.9), UInt64)
  6. ) ENGINE = ...

上述中的uniq, anyIf (任何+如果) 以及 分位数 都为ClickHouse中支持的聚合函数。

使用指南

数据写入

当需要写入数据时,您需要将数据包含在INSERT SELECT语句中,同时对于AggregateFunction类型的数据,您需要使用对应的以-State为后缀的函数进行处理。

函数使用示例

  1. uniqState(UserID)
  2. quantilesState(0.5, 0.9)(SendTiming)

不同于uniqquantiles函数返回聚合结果的最终值,以-State后缀的函数总是返回AggregateFunction类型的数据的中间状态。

对于SELECT而言,AggregateFunction类型总是以特定的二进制形式展现在所有的输出格式中。例如,您可以使用SELECT语句将函数的状态数据转储为TabSeparated格式的同时使用INSERT语句将数据转储回去。

数据查询

当从AggregatingMergeTree表中查询数据时,对于AggregateFunction类型的字段,您需要使用以-Merge为后缀的相同聚合函数来聚合数据。对于非AggregateFunction类型的字段,请将它们包含在GROUP BY子句中。

-Merge为后缀的聚合函数,可以将多个AggregateFunction类型的中间状态组合计算为最终的聚合结果。

例如,如下的两个查询返回的结果总是一致:

  1. SELECT uniq(UserID) FROM table
  2. SELECT uniqMerge(state) FROM (SELECT uniqState(UserID) AS state FROM table GROUP BY RegionID)

使用示例

请参阅 AggregatingMergeTree 的说明