LISTAGG 창 함수 - Amazon Redshift

LISTAGG 창 함수

LISTAGG 창 함수는 ORDER BY 표현식에 따라 쿼리 내 각 그룹의 행 순서를 지정한 다음, 값을 연결하여 문자열 하나로 만듭니다.

구문

LISTAGG( [DISTINCT] expression [, 'delimiter' ] ) [ WITHIN GROUP (ORDER BY order_list) ] OVER ( [PARTITION BY partition_expression] )

인수

DISTINCT

(선택 사항) 연결하기 전에 지정된 표현식에서 중복 값을 없애는 절입니다. 후행 공백은 무시되므로 문자열 'a''a '를 중복으로 간주합니다. LISTAGG는 발생한 첫 번째 값을 사용합니다. 자세한 내용은 후행 공백의 중요성 단원을 참조하십시오.

aggregate_expression

집계할 값을 제공하는 모든 유효 표현식(열 이름 등)입니다. NULL 값과 빈 문자열은 무시됩니다.

delimiter

(선택 사항) 연결된 값을 구분하는 문자열 상수입니다. 기본값은 NULL입니다.

WITHIN GROUP (ORDER BY order_list)

(선택 사항) 집계된 값의 정렬 순서를 지정하는 절입니다. ORDER BY 절에서 고유한 순서를 지정한 경우에 한해 확정적입니다. 기본값은 모든 행을 집계한 후 단일 값을 반환하는 것입니다.

OVER

창 파티션을 지정하는 절입니다. OVER 절에는 창 순서 또는 창 프레임 명세가 포함될 수 없습니다.

PARTITION BY partition_expression

(선택 사항) OVER 절에서 각 그룹의 레코드 범위를 설정합니다.

반환 값

VARCHAR(최대). 결과 집합이 최대 VARCHAR 크기(64K – 1, 즉 65535)보다 클 경우에는 LISTAGG가 다음과 같은 오류를 반환합니다.

Invalid operation: Result size exceeds LISTAGG limit

아래 예들에서는 WINSALES 테이블을 사용합니다. 요청 데이터에 대한 설명은 창 함수 예제를 위한 샘플 테이블 섹션을 참조하세요.

다음은 판매자 ID에 따라 순서를 지정하여 판매자 ID 목록을 반환하는 예입니다.

select listagg(sellerid) within group (order by sellerid) over() from winsales; listagg ------------ 11122333344 ... ... 11122333344 11122333344   (11 rows)

다음은 날짜에 따라 순서를 지정하여 구매자 B의 판매자 ID 목록을 반환하는 예입니다.

select listagg(sellerid) within group (order by dateid) over () as seller from winsales where buyerid = 'b' ; seller --------- 3233 3233 3233 3233

다음은 구매자 B의 판매 날짜 목록을 쉼표로 구분하여 반환하는 예입니다.

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

다음 예에서는 DISTINCT를 사용하여 구매자 B의 고유한 판매 날짜 목록을 반환합니다.

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

다음은 각 구매자 ID마다 판매 ID 목록을 쉼표로 구분하여 반환하는 예입니다.

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