LISTAGG 函數 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

LISTAGG 函數

對於查詢中的每一組,LISTAGG 彙整函數依據 ORDER BY 表達式來排序該組的列,然後將這些值串連成單一字串。

LISTAGG 是僅限於運算節點的函數。如果查詢未參考使用者定義的資料表或 Amazon Redshift 系統資料表,此函數會傳回錯誤。

Syntax (語法)

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