使用存在以发现是否存在具有特定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)