使用存在以发现是否存在具有特定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函数将最终状态转换为最终结果。 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>

此代码段将两个数组的元素合并为一个新数组。 操作在阵列的每个元素上独立执行,并生成值对。 如果一个数组较短,则添加空值以匹配较长数组的长度。 这发生在应用该函数之前。

示例

以下查询使用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)