- 카테고리:
집계 함수 (반정형 데이터) , 윈도우 함수 (일반) , 반정형 데이터 함수 (배열/오브젝트)
ARRAY_AGG¶
ARRAY로 피벗된 입력 값을 반환합니다. 입력이 비어 있는 경우, 빈 ARRAY가 반환됩니다.
- 별칭:
ARRAYAGG
구문¶
집계 함수
ARRAY_AGG( [ DISTINCT ] <expr1> ) [ WITHIN GROUP ( <orderby_clause> ) ]
윈도우 함수
ARRAY_AGG( [ DISTINCT ] <expr1> )
[ WITHIN GROUP ( <orderby_clause> ) ]
OVER ( [ PARTITION BY <expr2> ] )
인자¶
expr1
목록에 넣을 값을 결정하는 식(일반적으로 열 이름)입니다.expr2
값을 그룹화할 파티션을 결정하는 식(일반적으로 열 이름)입니다.orderby_clause
목록에서 값의 순서를 결정하는 식(일반적으로 열 이름)입니다.
사용법 노트¶
이 함수에는
DISTINCT
가 지원됩니다.WITHIN GROUP (<orderby_절>)
을 지정하지 않으면 각 배열 내의 요소 순서를 예측할 수 없습니다. (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()
를 사용하지 않는 SELECT
의 피벗되지 않은 출력을 보여줍니다. 이 예와 다음 예 사이의 출력 대조는 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 | | ] | +--------------------------------------------------------------+
이 예는 ARRAY_AGG()
와 함께 DISTINCT 키워드를 사용하는 방법을 보여줍니다.
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" | | | ] | +---------------+-------------------------------------------------------------+