【问题标题】:How do I output a set of columns and values, with one column per row as key value pairs in presto?如何在 presto 中输出一组列和值,每行一列作为键值对?
【发布时间】:2021-07-16 15:14:39
【问题描述】:

我有表格的数据

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 中是可能的吗?

【问题讨论】:

    标签: sql join amazon-athena presto


    【解决方案1】:

    您可以使用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)
    

    【讨论】:

    • 谢谢,我不知道可以使用 unnest 以这种方式将列转换为行!
    【解决方案2】:

    我手头没有 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-01
      • 2021-11-19
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多