我在 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'}
在提前不知道不同名称的情况下,我不知道如何做到这一点。有什么想法吗?
我不知道有多少个不同的值
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 |
---|
{颜色=红色,形状=三角形,尺寸=大} |
{颜色=红色,形状=正方形,尺寸=大} |
{颜色=红色,形状=圆形,尺寸=大} |
{颜色=红色,形状=三角形,尺寸=小} |
{颜色=红色,形状=方形,尺寸=小} |
{颜色=红色,形状=圆形,尺寸=小} |
{颜色=黄色,形状=三角形,尺寸=大} |
{颜色=黄色,形状=方形,尺寸=大} |
{颜色=黄色,形状=圆形,尺寸=大} |
{颜色=黄色,形状=三角形,尺寸=小} |
{颜色=黄色,形状=方形,尺寸=小} |
{颜色=黄色,形状=圆形,尺寸=小} |
请注意,对于任何大尺寸的输入,这将是一个相当繁重的查询(尽管您可能可以对其进行一些优化,例如在进行笛卡尔积之前进行过滤)