如何在presto中取消嵌套多列,输出到相应的行
How to unnest multiple columns in presto, outputting into corresponding rows
我正在尝试取消嵌套一些代码
我有几列有数组,两列都使用 |作为分隔符
The data would be stored looking like this, with extra values to the side which show the current currency
I want to output it like this
我试着做另一个 unnest 专栏,像这样
SELECT c.campaign, c.country, a.product_name, u.price--, u.price -- add price to this split. handy for QBR
FROM c, UNNEST(split(price, '|')) u(price), UNNEST(split(product_name, '|')) a(product_name)
group by 1,2, 3, 4
但这重复了几行,所以我不确定取消两列的嵌套是否有效
谢谢
您的查询的问题是子句 FROM c, UNNEST(...), UNNEST(...)
正在有效地计算 c
的每一行与每个派生的 table 产生的行之间的交叉连接来自 UNNEST
个电话。
您可以通过在对 UNNEST
的一次调用中取消所有数组的嵌套来解决它,从而生成一个派生的 table。当以这种方式使用时,UNNEST
生成一个 table,每个数组一列,数组中的每个元素一行。如果数组的长度不同,它将生成最大数组中元素数的行,并用 NULL
填充较小数组的列。
为了说明,对于你的情况,这就是你想要的:
WITH data(a, b, c) AS (
VALUES
('a|b|c', '1|2|3', 'CAD'),
('d|e|f', '4|5|6', 'USD')
)
SELECT t.a, t.b, data.c
FROM data, UNNEST(split(a, '|'), split(b, '|')) t(a, b)
产生:
a | b | c
---+---+-----
a | 1 | CAD
b | 2 | CAD
c | 3 | CAD
d | 4 | USD
e | 5 | USD
f | 6 | USD
(6 rows)
我正在尝试取消嵌套一些代码
我有几列有数组,两列都使用 |作为分隔符
The data would be stored looking like this, with extra values to the side which show the current currency
I want to output it like this 我试着做另一个 unnest 专栏,像这样
SELECT c.campaign, c.country, a.product_name, u.price--, u.price -- add price to this split. handy for QBR
FROM c, UNNEST(split(price, '|')) u(price), UNNEST(split(product_name, '|')) a(product_name)
group by 1,2, 3, 4
但这重复了几行,所以我不确定取消两列的嵌套是否有效
谢谢
您的查询的问题是子句 FROM c, UNNEST(...), UNNEST(...)
正在有效地计算 c
的每一行与每个派生的 table 产生的行之间的交叉连接来自 UNNEST
个电话。
您可以通过在对 UNNEST
的一次调用中取消所有数组的嵌套来解决它,从而生成一个派生的 table。当以这种方式使用时,UNNEST
生成一个 table,每个数组一列,数组中的每个元素一行。如果数组的长度不同,它将生成最大数组中元素数的行,并用 NULL
填充较小数组的列。
为了说明,对于你的情况,这就是你想要的:
WITH data(a, b, c) AS (
VALUES
('a|b|c', '1|2|3', 'CAD'),
('d|e|f', '4|5|6', 'USD')
)
SELECT t.a, t.b, data.c
FROM data, UNNEST(split(a, '|'), split(b, '|')) t(a, b)
产生:
a | b | c
---+---+-----
a | 1 | CAD
b | 2 | CAD
c | 3 | CAD
d | 4 | USD
e | 5 | USD
f | 6 | USD
(6 rows)