카테고리:

집계 함수 (반정형 데이터) , 윈도우 함수 (일반) , 반정형 데이터 함수 (배열/오브젝트)

ARRAY_AGG

ARRAY로 피벗된 입력 값을 반환합니다. 입력이 비어 있는 경우, 빈 ARRAY가 반환됩니다.

별칭:

ARRAYAGG

구문

집계 함수

ARRAY_AGG( [ DISTINCT ] <expr1> ) [ WITHIN GROUP ( <orderby_clause> ) ]
Copy

윈도우 함수

ARRAY_AGG( [ DISTINCT ] <expr1> )
    [ WITHIN GROUP ( <orderby_clause> ) ]
    OVER ( [ PARTITION BY <expr2> ] )
Copy

인자

  • expr1 목록에 넣을 값을 결정하는 식(일반적으로 열 이름)입니다.

  • expr2 값을 그룹화할 파티션을 결정하는 식(일반적으로 열 이름)입니다.

  • orderby_clause 목록에서 값의 순서를 결정하는 식(일반적으로 열 이름)입니다.

반환

ARRAY 형식의 값을 반환합니다.

ARRAY_AGG 가 단일 호출에 대해 반환할 수 있는 최대 데이터 양은 16MB입니다.

사용법 노트

  • 이 함수에는 DISTINCT 가 지원됩니다.

  • WITHIN GROUP (<orderby_절>) 을 지정하지 않으면 각 배열 내의 요소 순서를 예측할 수 없습니다. (WITHIN GROUP 절 외부의 ORDER BY 절은 행 내 배열 요소의 순서가 아니라 출력 행의 순서에 적용됩니다.)

  • DISTINCTWITHIN GROUP 을 지정하는 경우, 둘 다 동일 열을 참조해야 합니다. 예:

    SELECT array_agg(DISTINCT O_ORDERKEY) WITHIN GROUP (ORDER BY O_ORDERKEY) ...;
    
    Copy

    DISTINCTWITHIN GROUP 에 대해 서로 다른 열을 지정하면 다음과 같이 오류가 발생합니다.

    SELECT array_agg(DISTINCT O_ORDERKEY) WITHIN GROUP (ORDER BY O_ORDERSTATUS) ...;
    
    Copy
    SQL compilation error: [ORDERS.O_ORDERSTATUS] is not a valid order by expression
    
    Copy

    DISTINCTWITHIN 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);
Copy

이 예는 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 |
+------------+
Copy

이 예는 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                                                     |
| ]                                                            |
+--------------------------------------------------------------+
Copy

이 예는 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"                                                                       |
| ]                                                                           |
+-----------------------------------------------------------------------------+
Copy

이 예는 두 개의 개별 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"                                         |
|               | ]                                                           |
+---------------+-------------------------------------------------------------+
Copy