카테고리:

반정형 및 정형 데이터 함수 (상위 순위)

REDUCE

람다 식의 논리를 기반으로 배열 을 단일 값으로 줄입니다.

REDUCE 함수는 배열, 초기 누산기 값, 람다 함수를 취합니다. 배열의 각 요소에 람다 함수를 적용하여 각각의 결과로 누산기를 업데이트합니다. 모든 요소를 처리한 후 REDUCE는 최종 누산기 값을 반환합니다.

참고 항목:

Snowflake 고차 함수를 사용하여 데이터에 Lambda 함수 사용

구문

REDUCE( <array> , <init> [ <datatype> ] , <lambda_expression> )
Copy

인자

array

축소할 요소가 포함된 배열입니다. 배열은 반정형 또는 정형일 수 있습니다.

init [ datatype ]

초기 누산기 값입니다.

lambda_expression

각 배열 요소의 축소 논리를 정의하는 람다 식 입니다.

람다 식은 다음 구문으로 지정해야 합니다.

<acc> [ <datatype> ] , <value> [ <datatype> ] -> <expr>
Copy

acc 인자는 누산기이고, value 인자는 배열에서 현재 처리 중인 요소입니다.

반환

이 함수는 모든 데이터 타입의 값을 반환할 수 있습니다.

입력 배열이 비어 있을 경우 이 함수는 누산기의 초기값을 반환합니다.

다음 경우에 함수는 NULL을 반환합니다.

  • 입력 배열은 NULL입니다.

  • 축적기의 초기값은 NULL입니다.

  • 람다 함수는 NULL을 반환합니다.

사용법 노트

  • 람다 value 인자의 데이터 타입이 명시적으로 지정된 경우, 람다를 호출하기 전에 배열 요소가 지정된 형식으로 강제 변환됩니다. 강제 변환에 대한 자세한 내용은 데이터 타입 변환 섹션을 참조하십시오.

  • 형식 검사는 누산기의 초기값, 누산기 람다 인자, 람다 실행의 반환 값이 모두 강제적으로 동일한 논리적 형식과 물리적 형식을 갖도록 합니다. 이러한 요구 사항을 충족하기 위해 캐스팅 을 사용하는 경우 세 가지 형식 중 가장 큰 물리적 형식이 사용됩니다.

  • value 인자는 중간 NULL 값을 가질 수 있습니다. 예를 보려면 배열에서 NULL 값 건너뛰기 를 참조하십시오.

다음 예제에서는 REDUCE 함수를 사용합니다.

배열에 있는 값의 합 계산하기

REDUCE 함수를 사용하여 배열에 있는 값의 합을 반환하고 초기 누산기 값에는 0 을 지정합니다.

SELECT REDUCE([1,2,3],
              0,
              (acc, val) -> acc + val)
  AS sum_of_values;
Copy
+---------------+
| SUM_OF_VALUES |
|---------------|
|             6 |
+---------------+

이 예는 이전 예와 동일하지만 INT 타입의 정형 배열을 지정합니다.

SELECT REDUCE([1,2,3]::ARRAY(INT),
              0,
              (acc, val) -> acc + val)
  AS sum_of_values_structured;
Copy
+--------------------------+
| SUM_OF_VALUES_STRUCTURED |
|--------------------------|
|                        6 |
+--------------------------+

REDUCE 함수를 사용하여 배열에 있는 값의 합을 반환하고 초기 누산기 값에는 10 을 지정합니다.

SELECT REDUCE([1,2,3],
              10,
              (acc, val) -> acc + val)
  AS sum_of_values_plus_10;
Copy
+-----------------------+
| SUM_OF_VALUES_PLUS_10 |
|-----------------------|
|                    16 |
+-----------------------+

배열에 있는 각 값의 제곱의 합을 계산합니다.

REDUCE 함수를 사용하여 배열에 있는 각 값의 제곱의 합을 반환하고 초기 누산기 값에는 0 을 지정합니다.

SELECT REDUCE([1,2,3],
              0,
              (acc, val) -> acc + val * val)
  AS sum_of_squares;
Copy
+----------------+
| SUM_OF_SQUARES |
|----------------|
|             14 |
+----------------+

배열에서 NULL 값 건너뛰기

이 예에서 array 인자에는 NULL 값이 포함됩니다. 이 배열이 REDUCE 함수에 전달되면 누산기는 중간 NULL 값을 갖게 됩니다.

REDUCE 함수를 사용하여 배열에 있는 값의 합을 반환하고, 람다 식의 논리에서 IFNULL 함수를 사용하여 배열에서 NULL 값을 건너뜁니다. 람다 식은 다음 논리를 사용하여 배열의 각 값을 처리하기 위해 IFNULL 함수를 사용합니다.

  • acc + val 이 NULL인 경우에는 acc + 0 이 됩니다.

  • acc + val 이 NULL이 아닌 경우에는 acc + val 이 됩니다.

쿼리를 실행합니다.

SELECT REDUCE([1,NULL,2,NULL,3,4],
              0,
              (acc, val) -> IFNULL(acc + val, acc + 0))
  AS SUM_OF_VALUES_SKIP_NULL;
Copy
+-------------------------+
| SUM_OF_VALUES_SKIP_NULL |
|-------------------------|
|                      10 |
+-------------------------+

문자열 값 생성하기

REDUCE 함수를 사용하여 배열의 각 값을 연결하여 문자열 값 목록을 반환합니다.

SELECT REDUCE(['a', 'b', 'c'],
              '',
              (acc, val) -> acc || ' ' || val)
  AS string_values;
Copy
+---------------+
| STRING_VALUES |
|---------------|
|  a b c        |
+---------------+

축적기에 배열 사용하기

람다 식의 논리에서 ARRAY_PREPEND 함수와 함께 REDUCE 함수를 사용하여 입력 배열의 순서를 반전하는 배열을 반환합니다.

SELECT REDUCE([1, 2, 3, 4],
              [],
              (acc, val) -> ARRAY_PREPEND(acc, val))
  AS reverse_order;
Copy
+---------------+
| REVERSE_ORDER |
|---------------|
| [             |
|   4,          |
|   3,          |
|   2,          |
|   1           |
| ]             |
+---------------+

조건부 논리 사용하기

람다 식의 논리에서 IFF 함수와 함께 REDUCE 함수를 사용하면 if-then 식과 유사한 조건부 논리에 기반한 작업을 수행할 수 있습니다. 이 예에서는 람다 식에 다음 논리를 사용합니다.

  • 배열 값이 7보다 작으면 이 값을 제곱하여 누산기에 추가합니다.

  • 배열 값이 7보다 크거나 같으면 제곱하지 않고 누산기에 추가합니다.

SELECT REDUCE([5,10,15],
              0,
              (acc, val) -> IFF(val < 7, acc + val * val, acc + val))
  AS conditional_logic;
Copy
+-------------------+
| CONDITIONAL_LOGIC |
|-------------------|
|                50 |
+-------------------+

테이블의 요소로 구성된 배열을 단일 값으로 축소하기

열이 order_id, order_date, order_detail 인 이름이 orders 인 테이블이 있다고 가정해 보겠습니다. order_detail 열은 품목, 구매 수량, 소계로 구성된 배열입니다. 테이블에는 두 행의 데이터가 있습니다. 다음 SQL 문은 이 테이블을 생성하고 행을 삽입합니다.

CREATE OR REPLACE TABLE orders AS
  SELECT 1 AS order_id, '2024-01-01' AS order_date, [
    {'item':'UHD Monitor', 'quantity':3, 'subtotal':1500},
    {'item':'Business Printer', 'quantity':1, 'subtotal':1200}
  ] AS order_detail
  UNION SELECT 2 AS order_id, '2024-01-02' AS order_date, [
    {'item':'Laptop', 'quantity':5, 'subtotal':7500},
    {'item':'Noise-canceling Headphones', 'quantity':5, 'subtotal':1000}
  ] AS order_detail;

SELECT * FROM orders;
Copy
+----------+------------+-------------------------------------------+
| ORDER_ID | ORDER_DATE | ORDER_DETAIL                              |
|----------+------------+-------------------------------------------|
|        1 | 2024-01-01 | [                                         |
|          |            |   {                                       |
|          |            |     "item": "UHD Monitor",                |
|          |            |     "quantity": 3,                        |
|          |            |     "subtotal": 1500                      |
|          |            |   },                                      |
|          |            |   {                                       |
|          |            |     "item": "Business Printer",           |
|          |            |     "quantity": 1,                        |
|          |            |     "subtotal": 1200                      |
|          |            |   }                                       |
|          |            | ]                                         |
|        2 | 2024-01-02 | [                                         |
|          |            |   {                                       |
|          |            |     "item": "Laptop",                     |
|          |            |     "quantity": 5,                        |
|          |            |     "subtotal": 7500                      |
|          |            |   },                                      |
|          |            |   {                                       |
|          |            |     "item": "Noise-canceling Headphones", |
|          |            |     "quantity": 5,                        |
|          |            |     "subtotal": 1000                      |
|          |            |   }                                       |
|          |            | ]                                         |
+----------+------------+-------------------------------------------+

REDUCE 함수를 사용하여 각 주문의 모든 품목에 대한 소계를 반환합니다.

SELECT order_id,
       order_date,
       REDUCE(o.order_detail,
              0,
              (acc, val) -> acc + val:subtotal) subtotal_sum
  FROM orders o;
Copy
+----------+------------+--------------+
| ORDER_ID | ORDER_DATE | SUBTOTAL_SUM |
|----------+------------+--------------|
|        1 | 2024-01-01 |         2700 |
|        2 | 2024-01-02 |         8500 |
+----------+------------+--------------+

REDUCE 함수를 사용하여 각 주문에서 판매된 품목의 목록을 반환합니다.

SELECT order_id,
       order_date,
       REDUCE(o.order_detail,
              '',
              (acc, val) -> val:item || '\n' || acc) items_sold
  FROM orders o;
Copy
+----------+------------+-----------------------------+
| ORDER_ID | ORDER_DATE | ITEMS_SOLD                  |
|----------+------------+-----------------------------|
|        1 | 2024-01-01 | Business Printer            |
|          |            | UHD Monitor                 |
|          |            |                             |
|        2 | 2024-01-02 | Noise-canceling Headphones  |
|          |            | Laptop                      |
|          |            |                             |
+----------+------------+-----------------------------+