ARRAY_AGGREGATE

简介

ARRAY_AGGREGATE 函数是一种高阶数组聚合函数,类似于函数式编程中的

reduce
reduce
/
fold
fold
操作。它接收一个数组、一个初始值和一个 merge lambda 表达式,从初始值开始,依次将数组中的每个元素与累加器通过 merge lambda 进行合并,最终返回聚合结果。

语法

array_aggregate(array, initial_value, merge_lambda)

参数说明

  • array
    array
    : 输入的数组,类型为
    ARRAY<E>
    ARRAY<E>
    ,其中 E 可以是任意数据类型。
  • initial_value
    initial_value
    : 聚合的初始值(累加器初始状态),类型为
    R
    R
    ,可以是任意数据类型。
  • merge_lambda
    merge_lambda
    : 合并 lambda 表达式,格式为
    (acc, x) -> expr
    (acc, x) -> expr
    ,其中
    acc
    acc
    为当前累加器值(类型
    R
    R
    ),
    x
    x
    为数组中的当前元素(类型
    E
    E
    ),
    expr
    expr
    为合并后的新累加器值(类型
    R
    R
    )。

返回结果

返回类型与初始值

initial_value
initial_value
的类型一致(类型
R
R
),即 merge lambda 表达式的返回值类型。

使用示例

  1. 计算数组元素之和:

    SELECT array_aggregate(array(1, 2, 3), 0, (acc, x) -> acc + x); -- 输出结果:6

  2. 将嵌套数组合并为一个去重后的数组:

    SELECT array_aggregate(a, array(date '1999-01-01'), (acc, x) -> array_union(acc, x)) FROM VALUES (array(array(date '2020-10-10', date '2020-10-10'), array(date '2011-11-11'))), (array(array(date '2020-11-11'))) AS t(a); -- 输出结果: -- [1999-01-01,2020-10-10,2011-11-11] -- [1999-01-01,2020-11-11]

  3. 统计嵌套数组中去重后的元素总数:

    SELECT array_aggregate(a, 0, (acc, x) -> acc + array_size(array_distinct(x))) FROM VALUES (array(array(date '2020-10-10', date '2020-10-10'), array(date '2011-11-11'))), (array(array(date '2020-11-11'))) AS t(a); -- 输出结果: -- 2 -- 1

  4. 使用布尔累加器判断数组中所有元素是否满足条件:

    SELECT array_aggregate(a, true, (acc, x) -> acc AND (x > date '1990-01-01') AND (year(x) % 2 == 0) ) FROM VALUES (array(date '2020-10-10', date '1998-01-01')) AS t(a); -- 输出结果:true

  5. 当数组元素包含无法转换的值时,NULL 会通过 lambda 传播:

    SELECT array_aggregate(a, 0L, (acc, x) -> acc + coalesce(cast(x AS BIGINT), NULL) ) FROM VALUES (array('123', 'abc', '456')) AS t(a); -- 输出结果:NULL

注意事项

  • 使用 ARRAY_AGGREGATE 函数前,需要开启 JIT 代码生成:
    SET cz.sql.codegen.enable = TRUE;
    SET cz.sql.codegen.enable = TRUE;
  • 当输入数组为 NULL 时,返回结果为 NULL。
  • 当数组为空时,返回初始值
    initial_value
    initial_value
  • merge lambda 中如果产生 NULL 值,NULL 会继续参与后续迭代,可能导致最终结果为 NULL。建议在 lambda 中使用
    COALESCE
    COALESCE
    等函数处理 NULL 值。
  • 初始值的类型决定了累加器和最终返回值的类型,请确保 merge lambda 的返回类型与初始值类型兼容。
联系我们
预约咨询
微信咨询
电话咨询
邮件咨询