Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

LISTAGG 函数

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

语法

Copy
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 返回以下错误:

Copy
Invalid operation: Result size exceeds LISTAGG limit

使用说明

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

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

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

以下语句将成功执行。

Copy
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 进行排序)。

Copy
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 的列表。

Copy
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。

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

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

Copy
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 的逗号分隔的列表。

Copy
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