在 Presto SQL 中生成数组值的所有 n 元组

问题描述 投票:0回答:1

我在 Presto 中有以下数据集。

WITH A (name, distinct_values) AS (
  VALUES 
    ('color', ARRAY['red', 'yellow']),
    ('shape', ARRAY['triangle', 'square', 'circle']),
    ('size', ARRAY['big', 'small'])
)
select * from A

看起来像:

名字 不同的值
颜色 红、黄
形状 三角形、正方形、圆形
尺寸 大、小

我提前不知道

name
distinct_values
中有多少个不同的值。我想要的是一个地图列,其中每行有 3 个条目,一个条目对应颜色、形状和大小的每种可能组合。

tuples
{'color': 'red', 'shape': 'triangle', 'size': 'big'}
{'color': 'red', 'shape': 'triangle', 'size': 'small'}
{'color': 'red', 'shape': 'square', 'size': 'big'}
...
{'color': 'yellow', 'shape': 'circle', 'size': 'small'}

在提前不知道不同名称的情况下,我不知道如何做到这一点。有什么想法吗?

sql presto trino
1个回答
0
投票

我不知道有多少个不同的值

name

我想要一个地图列,其中每行有 3 个条目,一个条目对应颜色、形状和大小的每种可能组合。

可以说,这两个要求有点相互矛盾(尽管如果您只对

names
中的 3 个值感兴趣,您可以过滤掉所有其他值)。

根据我对任务的理解 - 你可以尝试使用

CROSS JOIN

WITH A (name, distinct_values) AS (
  VALUES
    ('color', ARRAY['red', 'yellow']),
    ('shape', ARRAY['triangle', 'square', 'circle']),
    ('size', ARRAY['big', 'small'])
),
-- query parts
 b as (
select name, value
from a
 , unnest(distinct_values) as t (value)
)

select cast(row(b_color.value, b_shape.value, b_size.value) as row(color varchar, shape varchar, size varchar ))
from b b_color
cross join b as b_shape
cross join b as b_size
where b_color.name = 'color' AND b_shape.name = 'shape' AND b_size.name = 'size';

输出:

_col0
{颜色=红色,形状=三角形,尺寸=大}
{颜色=红色,形状=正方形,尺寸=大}
{颜色=红色,形状=圆形,尺寸=大}
{颜色=红色,形状=三角形,尺寸=小}
{颜色=红色,形状=方形,尺寸=小}
{颜色=红色,形状=圆形,尺寸=小}
{颜色=黄色,形状=三角形,尺寸=大}
{颜色=黄色,形状=方形,尺寸=大}
{颜色=黄色,形状=圆形,尺寸=大}
{颜色=黄色,形状=三角形,尺寸=小}
{颜色=黄色,形状=方形,尺寸=小}
{颜色=黄色,形状=圆形,尺寸=小}

请注意,对于任何大尺寸的输入,这将是一个相当繁重的查询(尽管您可能可以对其进行一些优化,例如在进行笛卡尔积之前进行过滤)

© www.soinside.com 2019 - 2024. All rights reserved.