Amazon Redshift
数据库开发人员指南 (API 版本 2012-12-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

LISTAGG 函数

对于查询中的每个组,LISTAGG 聚合函数根据 ORDER BY 表达式对该组的行进行排序,然后将值串联成一个字符串。

LISTAGG 是仅计算节点函数。如果查询不引用用户定义的表或 Amazon Redshift 系统表,该函数将返回错误。

语法

LISTAGG( [DISTINCT] aggregate_expression [, 'delimiter' ] ) [ WITHIN GROUP (ORDER BY order_list) ]

参数

DISTINCT

(可选) 用于在串联之前消除指定表达式中重复值的子句。尾部空格将被忽略,因此会将字符串 'a''a ' 视为重复值。LISTAGG 将使用遇到的第一个值。有关更多信息,请参阅 尾部空格的意义

aggregate_expression

提供要聚合的值的任何有效表达式(如列名称)。忽略 NULL 值和空字符串。

delimiter

(可选) 用于分隔串联的值的字符串常数。默认值为 NULL。

WITHIN GROUP (ORDER BY order_list)

(可选) 用于指定聚合值的排序顺序的子句。

返回值

VARCHAR(MAX)。如果结果集大于最大 VARCHAR 大小(64K – 1 或 65535),则 LISTAGG 返回以下错误:

Invalid operation: Result size exceeds LISTAGG limit

使用说明

如果语句包含多个使用 WITHIN GROUP 子句的 LISTAGG 函数,则每个 WITHIN GROUP 子句必须使用相同的 ORDER BY 值。

例如,以下语句将返回错误。

select listagg(sellerid) within group (order by dateid) as sellers, listagg(dateid) within group (order by sellerid) as dates from winsales;

以下语句将成功执行。

select listagg(sellerid) within group (order by dateid) as sellers, listagg(dateid) within group (order by dateid) as dates from winsales; select listagg(sellerid) within group (order by dateid) as sellers, listagg(dateid) as dates from winsales;

示例

以下示例聚合卖家 ID(按卖家 ID 进行排序)。

select listagg(sellerid, ', ') within group (order by sellerid) from sales where eventid = 4337; listagg ---------------------------------------------------------------------------------------------------------------------------------------- 380, 380, 1178, 1178, 1178, 2731, 8117, 12905, 32043, 32043, 32043, 32432, 32432, 38669, 38750, 41498, 45676, 46324, 47188, 47188, 48294

以下示例使用 DISTINCT 返回唯一卖家 ID 的列表。

select listagg(distinct sellerid, ', ') within group (order by sellerid) from sales where eventid = 4337; listagg ------------------------------------------------------------------------------------------- 380, 1178, 2731, 8117, 12905, 32043, 32432, 38669, 38750, 41498, 45676, 46324, 47188, 48294

以下示例按日期顺序聚合卖家 ID。

select listagg(sellerid) within group (order by dateid) from winsales; listagg ------------- 31141242333

以下示例返回买家 B 的销售日期的竖线分隔的列表。

select listagg(dateid,'|') within group (order by sellerid desc,salesid asc) from winsales where buyerid = 'b'; listagg --------------------------------------- 2003-08-02|2004-04-18|2004-04-18|2004-02-12

以下示例返回每个买家 ID 的销售 ID 的逗号分隔的列表。

select buyerid, listagg(salesid,',') within group (order by salesid) as sales_id from winsales group by buyerid order by buyerid; buyerid | sales_id -----------+------------------------ a |10005,40001,40005 b |20001,30001,30004,30003 c |10001,20002,30007,10006