이(가) 존재하여 특정 SKU를 사용하는 제품이 존재하는지 여부 검색

exists(array<T>, function<T, boolean>): boolean

위의 코드 조각에서 exists 함수는 배열의 각 요소에 적용되며 부울 값을 반환합니다. 부울은 배열에 지정된 조건을 충족하는 요소가 하나 이상 있는지 여부를 나타냅니다. 이 경우 특정 SKU를 사용하는 제품이 존재하는지 확인합니다.

아래 SQL 예제에서 쿼리는 geometrixxx_999_xdm_pqs_1batch_10k_rows 테이블에서 productListItems을(를) 가져오고 productListItems 배열에서 SKU가 123679과(와) 같은 요소가 있는지 평가합니다. 그런 다음 특정 범위의 타임스탬프를 기반으로 결과를 필터링하고 최종 결과를 10개의 행으로 제한합니다.

SELECT productListItems
FROM geometrixxx_999_xdm_pqs_1batch_10k_rows
WHERE EXISTS( productListItems, value -> value.sku == 123679)
AND timestamp > to_timestamp('2017-11-01 00:00:00')
AND timestamp < to_timestamp('2017-11-02 00:00:00')limit 10;

결과

이 SQL의 결과는 아래에 표시된 결과와 유사합니다.

productListItems
-----------------
{(123679, NULL,NULL)}
{(123679, NULL, NULL)}
{(123679, NULL, NULL), (150196, NULL, NULL)}
{(123679, NULL, NULL), (150196, NULL, NULL)}
{(123679, NULL, NULL), (150196, NULL, NULL)}
{(123679, NULL, NULL)}
{(123679, NULL, NULL)}
{(123679, NULL, NULL)}
{(123679, NULL,NULL)}
{(123679,NULL, NULL)}

(10 rows)

필터를 사용하여 SKU > 100000

filter(array<T>, function<T, boolean>): array<T>

이 함수는 각 요소를 부울 값으로 평가하는 주어진 조건을 기반으로 요소 배열을 필터링합니다. 그런 다음 조건이 true 값을 반환하는 요소만 포함하는 새 배열을 반환합니다.

아래 쿼리는 productListItems 열을 선택하고, SKU가 100000보다 큰 요소만 포함하도록 필터를 적용하고, 결과 집합을 특정 타임스탬프 범위 내의 행으로 제한합니다. 그런 다음 필터링된 배열은 출력에서 _filter(으)로 별칭이 지정됩니다.

SELECT productListItems,
    Filter(productListItems, value -> value.sku > 100000) AS _filter
FROM geometrixxx_999_xdm_pqs_1batch_10k_rows
WHERE timestamp > To_timestamp('2017-11-01 00:00:00')
AND timestamp < To_timestamp('2017-11-02 00:00:00')
LIMIT 10;

결과

이 SQL의 결과는 아래에 표시된 결과와 유사합니다.

productListItems | _filter
-----------------+---------
(123679, NULL, NULL) (123679, NULL, NULL)
(1346, NULL, NULL) |
(98347, NULL, NULL) |
(176015, NULL, NULL) | (176015, NULL, NULL)

(10 rows)

합계를 사용하여 특정 ID와 연결된 모든 제품 목록 항목의 SKU를 합하고 결과 합계를 두 배로 늘립니다.

aggregate(array<T>, A, function<A, T, A>[, function<A, R>]): R

이 집계 작업은 이진 연산자를 초기 상태와 배열의 모든 요소에 적용합니다. 또한 여러 값을 단일 상태로 줄입니다. 이 감소 후 최종 상태는 마무리 함수를 사용하여 최종 결과로 변환됩니다. finish 함수는 모든 배열 요소에 이진 연산자를 적용한 후 얻은 마지막 상태를 사용하고, 최종 결과를 생성하기 위해 이와 함께 어떤 작업을 수행합니다.

이 쿼리 예제는 지정된 타임스탬프 범위 내의 productListItems 배열에서 최대 SKU 값을 계산하고 결과를 두 배로 늘립니다. 출력에는 원본 productListItems 배열과 계산된 max_value이(가) 포함됩니다.

SELECT productListItems,
aggregate(productListItems, 0, (acc, value) ->
case
WHEN (
value.sku > acc) THEN cast(value.sku AS int)
ELSE cast(acc AS int)
END, acc -> acc * 2) AS max_value
FROM geometrixxx_999_xdm_pqs_1batch_10k_rows
WHERE timestamp > to_timestamp('2017-11-01 00:00:00')
AND timestamp < to_timestamp('2017-11-02 00:00:00')
LIMIT 50;

결과

이 SQL의 결과는 아래에 표시된 결과와 유사합니다.

productListItems | max_value
-----------------+---------
(123679, NULL, NULL) | 247358
(1346,NULL, NULL) | 2692
(98347, NULL, NULL) | 196694
(176015, NULL, NULL) | 352030

(10 rows)

zip_with를 사용하여 제품 목록의 모든 항목에 시퀀스 번호를 지정합니다

zip_with(array<T>, array<U>, function<T, U, R>): array<R>

이 코드 조각은 두 배열의 요소를 하나의 새 배열로 결합합니다. 이 작업은 배열의 각 요소에 대해 독립적으로 수행되며 값의 쌍을 생성합니다. 배열 하나가 짧으면 긴 배열의 길이와 일치하도록 null 값이 추가됩니다. 이 문제는 함수가 적용되기 전에 발생합니다.

다음 쿼리는 zip_with 함수를 사용하여 두 배열에서 값 쌍을 만듭니다. 이 작업은 productListItems 배열의 SKU 값을 Sequence 함수를 사용하여 생성된 정수 시퀀스에 추가하여 수행합니다. 원래 productListItems 열과 함께 결과가 선택되었으며 타임스탬프 범위에 따라 제한됩니다.

SELECT productListItems,
zip_with(Sequence(1,5), Transform(productListItems, p -> p.sku), (x,y) -> struct(x, y)) AS zip_with
FROM geometrixxx_999_xdm_pqs_1batch_10k_rows
WHERE timestamp > to_timestamp('2017-11-01 00:00:00')
AND timestamp < to_timestamp('2017-11-02 00:00:00')
limit 10;

결과

이 SQL의 결과는 아래에 표시된 결과와 유사합니다.

productListItems     | zip_with
---------------------+---------
                     | {(1,NULL), (2,NULL), (3,NULL),(4,NULL), (5,NULL)}
(123679, NULL, NULL) | {(1,123679), (2,NULL), (3,NULL), (4,NULL), (5,NULL)}
                     | {(1,NULL), (2,NULL),(3,NULL),(4,NULL), (5,NULL)}
                     | {(1,NULL), (2,NULL), (3, NULL),(4,NULL), (5,NULL)}
(1346,NULL, NULL)    | {(1,1346), (2,NULL),(3,NULL),(4,NULL), (5,NULL)}
                     | {(1,NULL), (2,NULL), (3,NULL),(4,NULL), (5,NULL)}
(98347, NULL, NULL)  | {(1,98347), (2,NULL), (3,NULL), (4,NULL), (5,NULL)}
                     | {(1,NULL), (2,NULL), (3,NULL), (4,NULL), (5,NULL)}
(176015, NULL, NULL) | {(1,176015),(2,NULL), (3,NULL), (4,NULL), (5,NULL)}
                     | {(1,NULL), (2,NULL), (3,NULL), (4,NULL), (5,NULL)}

(10 rows)

map_from_entries를 사용하여 제품 목록의 각 항목에 시퀀스 번호를 지정하고 최종 결과를 맵으로 얻습니다.

map_from_entries(array<struct<K, V>>): map<K, V>

이 코드 조각은 키-값 쌍의 배열을 맵으로 변환합니다. 보다 조직적이고 효율적인 구조를 활용할 수 있는 키-값 쌍 데이터를 처리할 때 유용합니다.

다음 쿼리는 시퀀스 및 productListItems 배열에서 값 쌍을 만들고 map_from_entries를 사용하여 이 쌍을 맵으로 변환한 다음 새로 만든 map_from_entries 열과 함께 원래 productListItems 열을 선택합니다. 결과는 지정된 타임스탬프 범위를 기반으로 필터링되고 제한됩니다.

SELECT productListItems,      map_from_entries(zip_with(Sequence(1,Size(productListItems)), productListItems, (x,y) -> struct(x, y))) AS map_from_entries
FROM   geometrixxx_999_xdm_pqs_1batch_10k_rows
WHERE  timestamp > to_timestamp('2017-11-01 00:00:00')
AND    timestamp < to_timestamp('2017-11-02 00:00:00')
LIMIT 10;

결과

이 SQL의 결과는 아래에 표시된 결과와 유사합니다.

productListItems     | map_from_entries
---------------------+------------------
(123679, NULL, NULL) | [1 -> "(123679,NULL,NULL)"]
(1346, NULL, NULL)   | [1 -> "(1346, NULL, NULL)"]
(98347, NULL, NULL)  | [1 -> "(98347, NULL, NULL)"]
(176015, NULL, NULL) | [1 -> "(176015, NULL, NULL)"]
(92763, NULL, NULL)  | [1 -> "(92763, NULL, NULL)"]
(48576, NULL, NULL)  | [1 -> "(48576, NULL, NULL)"]
(135778, NULL, NULL) | [1 -> "(135778, NULL, NULL)"]
(123679, NULL, NULL) | [1 -> "(123679, NULL, NULL)"]
(98347, NULL, NULL)  | [1 -> "(98347, NULL, NULL)"]
(167753, NULL, NULL) | [1 -> "(167753, NULL, NULL)"]

(10 rows)