如何输出一组列和值,每行一列作为 presto 中的键值对?
How do I output a set of columns and values, with one column per row as key value pairs in presto?
我有表格的数据
id | col1 | col2 | col3 | col4 | col5 | col6 |
----------------------------------------------
1 | a | b | c | d | e | f |
2 | a | b | c | d | e | f |
3 | a | b | c | d | e | f |
我正在尝试填写表格
id | key | value |
------------------
1 | col1| a
1 | col2| b
1 | col3| c
1 | col4| d
1 | col5| e
1 | col6| f
2 | col1| a
2 | col2| b
2 | col3| c
2 | col4| d
2 | col5| e
2 | col6| f
3 | col1| a
3 | col2| b
3 | col3| c
3 | col4| d
3 | col5| e
3 | col6| f
而且我一辈子都想不出该怎么做。我可以完成相反的操作,并通过执行以下操作将地图转换为基于键的单行,但我不确定如何根据列从单行转到多行。
SELECT
id,
key['a'] AS col1,
key['b'] AS col2
FROM (
SELECT id, map_agg(key, value) key
FROM table_a
GROUP BY id
) temp
这有可能吗?
我手头没有 Presto/Athena 来测试这个,但我认为方法是:
select t.id, kv[1] as key, kv[2] as value
from (select t.*,
array[row('col1', col1),
row('col2', col2),
row('col3', col3),
row('col4', col4),
row('col5', col5),
row('col6', col6)
] as kv_ar
from t
) t cross join
unnest(kv_ar) kv
您可以压缩数组并使用 cross join unnest
取消嵌套它们。因此,使用列名和列值构造一个压缩数组,然后使用 unnest.
with test (id,col1,col2,col3,col4,col5,col6) AS (
values
(1,'a','b','c','d','e','f'),
(2,'a','b','c','d','e','f'),
(3,'a','b','c','d','e','f')
)
select id, k, v
from test
cross join unnest(
array['col1', 'col2', 'col3', 'col4','col5', 'col6']
, array[col1, col2, col3, col4, col5, col6]
) as x(k, v)
我有表格的数据
id | col1 | col2 | col3 | col4 | col5 | col6 |
----------------------------------------------
1 | a | b | c | d | e | f |
2 | a | b | c | d | e | f |
3 | a | b | c | d | e | f |
我正在尝试填写表格
id | key | value |
------------------
1 | col1| a
1 | col2| b
1 | col3| c
1 | col4| d
1 | col5| e
1 | col6| f
2 | col1| a
2 | col2| b
2 | col3| c
2 | col4| d
2 | col5| e
2 | col6| f
3 | col1| a
3 | col2| b
3 | col3| c
3 | col4| d
3 | col5| e
3 | col6| f
而且我一辈子都想不出该怎么做。我可以完成相反的操作,并通过执行以下操作将地图转换为基于键的单行,但我不确定如何根据列从单行转到多行。
SELECT
id,
key['a'] AS col1,
key['b'] AS col2
FROM (
SELECT id, map_agg(key, value) key
FROM table_a
GROUP BY id
) temp
这有可能吗?
我手头没有 Presto/Athena 来测试这个,但我认为方法是:
select t.id, kv[1] as key, kv[2] as value
from (select t.*,
array[row('col1', col1),
row('col2', col2),
row('col3', col3),
row('col4', col4),
row('col5', col5),
row('col6', col6)
] as kv_ar
from t
) t cross join
unnest(kv_ar) kv
您可以压缩数组并使用 cross join unnest
取消嵌套它们。因此,使用列名和列值构造一个压缩数组,然后使用 unnest.
with test (id,col1,col2,col3,col4,col5,col6) AS (
values
(1,'a','b','c','d','e','f'),
(2,'a','b','c','d','e','f'),
(3,'a','b','c','d','e','f')
)
select id, k, v
from test
cross join unnest(
array['col1', 'col2', 'col3', 'col4','col5', 'col6']
, array[col1, col2, col3, col4, col5, col6]
) as x(k, v)