- 类别:
聚合函数 (半结构化数据)、窗口函数 (常规)、半结构化和结构化数据函数 (数组/对象)
ARRAY_AGG¶
返回输入值,并将其转换为数组。如果输入为空,该函数返回一个空数组。
- 别名:
ARRAYAGG
语法¶
聚合函数
窗口函数
实参¶
必填:
expr1确定要输入至数组的值的表达式(通常是列名)。
OVER()OVER 子句指定将该函数用作窗口函数。有关详细信息,请参阅 窗口函数的语法和用法。
可选:
DISTINCT从数组中删除重复的值。
WITHIN GROUP orderby_clause包含一个或多个表达式(通常是列名)的子句,用于确定每个数组中值的顺序。
WITHIN GROUP (ORDER BY) 语法支持与 SELECT 语句中的主 ORDER BY 子句相同的参数。请参阅 ORDER BY。
PARTITION BY expr2指定表达式(通常是列名)的窗口函数子句。此表达式定义在应用函数之前对输入行进行分组的分区。有关详细信息,请参阅 窗口函数的语法和用法。
ORDER BY expr3[ { ASC | DESC } ] [ NULLS { FIRST | LAST } ] [{window_frame}]每个分区内要排序的可选表达式,后跟可选窗口框架。有关
window_frame语法的详细信息,请参阅 窗口函数的语法和用法。在基于范围的框架中使用该函数时,ORDER BY 子句仅支持单列。基于行的框架没有此限制。
不支持 LIMIT。
返回¶
返回类型 ARRAY 的值。
ARRAY_AGG 在单次调用中可返回的最大数据量为 128 MB。
使用说明¶
如果您没有指定 WITHIN GROUP(ORDER BY),每个数组内元素的顺序是不可预测的。(WITHIN GROUP 子句外部的 ORDER BY 子句可应用于输出行的顺序,而不是行内数组元素的顺序。)
如果您为 WITHIN GROUP(ORDER BY) 中的表达式指定一个数字,这个数字被解析为一个数字常量,而不是 SELECT 列表中的列顺序位置。因此,不要将数字指定为 WITHIN GROUP(ORDER BY) 表达式。
如果您指定 DISTINCT 和 WITHIN GROUP,则两者必须引用同一列。例如:
如果为 DISTINCT 和 WITHIN GROUP 指定不同的列,则会发生错误:
必须为 DISTINCT 和 WITHIN GROUP 指定同一列,或者省略 DISTINCT。
仅当 OVER 子句中没有 ORDER BY 子句时,窗口函数调用才支持 DISTINCT 和 WITHIN GROUP。在 OVER 子句中使用 ORDER BY 子句时,输出数组中的值遵循相同的默认顺序(即相当于
WITHIN GROUP (ORDER BY expr3)的顺序)。输出中省略 NULL 值。
示例¶
以下示例查询使用如下所示的表和数据:
以下示例显示了来源于不使用 ARRAY_AGG() 查询的非透视输出。以下示例与以下示例之间的输出对比表明 ARRAY_AGG() 对数据进行透视。
以下示例展示如何使用 ARRAY_AGG() 将输出列透视为单行中的数组:
以下示例展示了 DISTINCT 关键字与 ARRAY_AGG() 的配合使用。
以下示例使用两个单独的 ORDER BY 子句,其中一个子句控制每行内输出数组内的顺序,另一个子句控制输出行的顺序:
以下示例使用不同的数据集。ARRAY_AGG 函数作为带有 ROWS BETWEEN 窗口框架的窗口函数调用。首先,创建表并加载 14 行数据:
现在运行以下查询。请注意,此处仅显示部分结果集。