- 类别:
聚合函数 (半结构化数据)、窗口函数 (常规)、半结构化和结构化数据函数 (数组/对象)
ARRAY_AGG¶
返回输入值,并将其转换为数组。如果输入为空,该函数返回一个空数组。
- 别名:
ARRAYAGG
语法¶
聚合函数
ARRAY_AGG( [ DISTINCT ] <expr1> ) [ WITHIN GROUP ( <orderby_clause> ) ]
窗口函数
ARRAY_AGG( [ DISTINCT ] <expr1> )
[ WITHIN GROUP ( <orderby_clause> ) ]
OVER ( [ PARTITION BY <expr2> ] )
实参¶
必填:
expr1
确定要输入至数组的值的表达式(通常是列名)。
OVER()
OVER 子句指定将该函数用作窗口函数。有关详细信息,请参阅 窗口函数。
可选:
返回¶
返回类型 ARRAY 的值。
ARRAY_AGG 单次调用可返回的最大数据量为 16MB。
使用说明¶
如果您没有指定 WITHIN GROUP(ORDER BY),每个数组内元素的顺序是不可预测的。(WITHIN GROUP 子句外部的 ORDER BY 子句可应用于输出行的顺序,而不是行内数组元素的顺序。)
如果您为 WITHIN GROUP(ORDER BY) 中的表达式指定一个数字,这个数字被解析为一个数字常量,而不是 SELECT 列表中的列顺序位置。因此,不要将数字指定为 WITHIN GROUP(ORDER BY) 表达式。
如果您指定 DISTINCT 和 WITHIN GROUP,则两者必须引用同一列。例如:
SELECT ARRAY_AGG(DISTINCT O_ORDERKEY) WITHIN GROUP (ORDER BY O_ORDERKEY) ...;
如果为 DISTINCT 和 WITHIN GROUP 指定不同的列,则会发生错误:
SELECT ARRAY_AGG(DISTINCT O_ORDERKEY) WITHIN GROUP (ORDER BY O_ORDERSTATUS) ...;
SQL compilation error: [ORDERS.O_ORDERSTATUS] is not a valid order by expression
必须为 DISTINCT 和 WITHIN GROUP 指定同一列,或者省略 DISTINCT。
输出中省略 NULL 值。
用作窗口函数时,此函数不支持:
OVER() 子句中的 ORDER BY 分子句。
窗口框架。
示例¶
以下示例查询使用如下所示的表和数据:
CREATE TABLE orders ( o_orderkey INTEGER, -- unique ID for each order. o_clerk VARCHAR, -- identifies which clerk is responsible. o_totalprice NUMBER(12, 2), -- total price. o_orderstatus CHAR(1) -- 'F' = Fulfilled (sent); -- 'O' = 'Ordered but not yet Fulfilled'. ); INSERT INTO orders (o_orderkey, o_orderstatus, o_clerk, o_totalprice) VALUES ( 32123, 'O', 'Clerk#000000321', 321.23), ( 41445, 'F', 'Clerk#000000386', 1041445.00), ( 55937, 'O', 'Clerk#000000114', 1055937.00), ( 67781, 'F', 'Clerk#000000521', 1067781.00), ( 80550, 'O', 'Clerk#000000411', 1080550.00), ( 95808, 'F', 'Clerk#000000136', 1095808.00), (101700, 'O', 'Clerk#000000220', 1101700.00), (103136, 'F', 'Clerk#000000508', 1103136.00);
以下示例显示了来源于不使用 ARRAY_AGG() 查询的非透视输出。以下示例与以下示例之间的输出对比表明 ARRAY_AGG() 对数据进行透视。
SELECT O_ORDERKEY AS order_keys FROM orders WHERE O_TOTALPRICE > 450000 ORDER BY O_ORDERKEY; +------------+ | ORDER_KEYS | |------------| | 41445 | | 55937 | | 67781 | | 80550 | | 95808 | | 101700 | | 103136 | +------------+
以下示例展示如何使用 ARRAY_AGG() 将输出列透视为单行中的数组:
SELECT ARRAY_AGG(O_ORDERKEY) WITHIN GROUP (ORDER BY O_ORDERKEY ASC) FROM orders WHERE O_TOTALPRICE > 450000; +--------------------------------------------------------------+ | ARRAY_AGG(O_ORDERKEY) WITHIN GROUP (ORDER BY O_ORDERKEY ASC) | |--------------------------------------------------------------| | [ | | 41445, | | 55937, | | 67781, | | 80550, | | 95808, | | 101700, | | 103136 | | ] | +--------------------------------------------------------------+
以下示例展示了 DISTINCT 关键字与 ARRAY_AGG() 的配合使用。
SELECT ARRAY_AGG(DISTINCT O_ORDERSTATUS) WITHIN GROUP (ORDER BY O_ORDERSTATUS ASC) FROM orders WHERE O_TOTALPRICE > 450000 ORDER BY O_ORDERSTATUS ASC; +-----------------------------------------------------------------------------+ | ARRAY_AGG(DISTINCT O_ORDERSTATUS) WITHIN GROUP (ORDER BY O_ORDERSTATUS ASC) | |-----------------------------------------------------------------------------| | [ | | "F", | | "O" | | ] | +-----------------------------------------------------------------------------+
以下此示例使用两个单独的 ORDER BY 子句,其中一个子句控制每行内输出数组内的顺序,另一个子句控制输出行的顺序:
SELECT O_ORDERSTATUS, ARRAYAGG(O_CLERK) WITHIN GROUP (ORDER BY O_TOTALPRICE DESC) FROM orders WHERE O_TOTALPRICE > 450000 GROUP BY O_ORDERSTATUS ORDER BY O_ORDERSTATUS DESC; +---------------+-------------------------------------------------------------+ | O_ORDERSTATUS | ARRAYAGG(O_CLERK) WITHIN GROUP (ORDER BY O_TOTALPRICE DESC) | |---------------+-------------------------------------------------------------| | O | [ | | | "Clerk#000000220", | | | "Clerk#000000411", | | | "Clerk#000000114" | | | ] | | F | [ | | | "Clerk#000000508", | | | "Clerk#000000136", | | | "Clerk#000000521", | | | "Clerk#000000386" | | | ] | +---------------+-------------------------------------------------------------+