Skip to content

聚合函数

聚合函数对一组值执行计算并返回单个值。聚合函数只能用在以下表达式中:

  • select 语句的 select 列表(子查询或外部查询)。
  • HAVING 子句。

AVG

text
avg(col)

返回组中的平均值。空值不参与计算。支持增量计算。

COUNT

text
count(*)
count(col)

返回组中的项目数。空值不参与计算。支持增量计算。

MAX

text
max(col)

返回组中的最大值。空值不参与计算。支持增量计算。

MIN

text
min(col)

返回组中的最小值。空值不参与计算。支持增量计算。

SUM

text
sum(col)

返回组中所有值的总和。空值不参与计算。支持增量计算。

COLLECT

text
collect(*)
collect(col)

返回组中指定的列或整个消息(参数为*时)的值组成的数组。支持增量计算。

示例

  • 获取当前窗口所有消息的列 a 的值组成的数组。假设列 a 的类型为 int, 则结果为: [{"r1":[32, 45]}]

    sql
    SELECT collect(a) as r1 FROM test GROUP BY TumblingWindow(ss, 10)
  • 获取当前窗口所有消息的值组成的数组。结果为: [{"r1":[{"a":32, "b":"hello"}, {"a":45, "b":"world"}]}]

    sql
    SELECT collect(*) as r1 FROM test GROUP BY TumblingWindow(ss, 10)
  • 获取当前窗口第二个消息的列 a 的值。结果为: [{"r1":32}]

    sql
    SELECT collect(*)[1]->a as r1 FROM test GROUP BY TumblingWindow(ss, 10)

LAST_VALUE

text
last_value(*, true)
last_value(col, false)

用于返回在组中指定列或整个消息中最后一行的值。该函数有两个参数,第一个参数用于指定列或整个消息,第二个参数用于指定是否需要忽略空值;如果第二个参数为 true,则该函数仅返回最后的非空值,如果没有非空值,则返回空值;如果第二个参数为 false,则函数将返回最后的值,无论它是否为空。支持增量计算。

MERGE_AGG

text
merge_agg(*)
merge_agg(col)

将组中的值合并为单个值。若存在重复键时取较后对象的值。它不进行递归操作;只合并顶级键值。

如果参数是列,结果将是一个包含列中所有对象的键的联合的对象。如果列只包含非对象值,则结果将是一个空对象。支持增量计算。

示例

假设组中的值如下所示:

json
{"a": {"a": 2}, "b": 2, "c": 3}
{"a": {"b": 2}, "b": 5, "d": 6}
{"a": {"a": 3}, "b": 8}
  • 合并 * 结果为: {"a": {"a": 3}, "b": 8, "c": 3, "d": 6}

    sql
    SELECT merge_agg(*) as r1 FROM test GROUP BY TumblingWindow(ss, 10)
  • 合并对象列,结果为: {"a": 3, "b": 2}

    sql
    SELECT merge_agg(a) as r1 FROM test GROUP BY TumblingWindow(ss, 10)
  • 合并非对象列: {}

    sql
    SELECT merge_agg(b) as r1 FROM test GROUP BY TumblingWindow(ss, 10)

DEDUPLICATE

text
deduplicate(col, false)

返回当前组去重的结果,通常用在窗口中。其中,第一个参数指定用于去重的列;第二个参数指定是否返回全部结果。若为 false ,则仅返回最近的未重复的项;若最近的项有重复,则返回空数组;此时可以设置 sink 参数 omitIfEmpty,使得 sink 接到空结果后不触发。

示例

  • 获取当前窗口中,列 a 值不重复的所有消息组成的数组。结果为: [{"r1":{"a":32, "b":"hello"}, {"a":45, "b":"world"}}]

    sql
    SELECT deduplicate(a, true) as r1 FROM test GROUP BY TumblingWindow(ss, 10)
  • 获取列 a 值在过去一小时中不重复的值。每收到一条新消息,都会检测列 a 是否重复,若不重复则输出:[{"r1":32}] 或者 [{"r1":45}]。若检测到重复值,则输出 [{}] 。此时,可以设置 omitIfEmpty 的 sink 参数使得检测到重复值时不触发规则。

    sql
    SELECT deduplicate(a, false)->a as r1 FROM demo GROUP BY SlidingWindow(hh, 1)

MEDIAN

text
median(col)

返回组中所有值的中位数。

STDDEV

text
stddev(col)

返回组中所有值的标准差。空值不参与计算。

STDDEVS

text
stddevs(col)

返回组中所有值的样本标准差。空值不参与计算。

VAR

text
var(col)

返回组中所有值的方差。空值不参与计算。

VARS

text
vars(col)

返回组中所有值的样本方差。空值不参与计算。

PERCENTILE

text
percentile(col, 0.5)

返回组中所有值的指定百分位数。空值不参与计算。其中,第一个参数指定用于计算百分位数的列;第二个参数指定百分位数的值,取值范围为 0.0 ~ 1.0 。

PERCENTILE_DISC

text
percentile_disc(col, 0.5)

返回组中所有值的指定百分位数。空值不参与计算。其中,第一个参数指定用于计算百分位数的列;第二个参数指定百分位数的值,取值范围为 0.0 ~ 1.0 。

LAST_AGG_HIT_COUNT

text
last_agg_hit_count()

返回该函数的总命中次数。通常用于获取聚合规则的累计触发次数。如果在 HAVING 子句中使用,只有当条件为真时才会更新计数。 若要在非聚合规则中实现类似功能,请使用 last_hit_count

LAST_AGG_HIT_TIME

text
last_agg_hit_time()

返回该函数最后一次命中时的 int64 格式时间戳。通常用于获取聚合规则的最后一次触发时间。如果在 HAVING 子句中使用,只有当条件为真时才会更新时间戳。 若要在非聚合规则中实现类似功能,请使用 last_hit_time