通过旋转将Presto列转换为行

dal*_*ler 7 sql presto

这是所需的输入和所需的输出.我不熟悉SQL或Presto中使用的术语,文档似乎指向使用,map_agg但我认为这里的问题是动态创建列,但是如果a, b, ...列可以知道且有限的话,这很奇怪.

我很高兴在SQL或Presto中了解它的正确功能,当然如果可行的话.优选地,以不涉及每个所需行=>列手动添加子句的方式.必须有一种方法可以自动执行此操作,或者通过提供值列表来过滤转换为标题的行(如'a'以下将如何移动为列标题)

table_a:

id | key | value

 0 |   'a'  |   1
 1 |   'b'  |   2
Run Code Online (Sandbox Code Playgroud)

然后成为desired:

id | 'a' | 'b' 
 0    1    2
Run Code Online (Sandbox Code Playgroud)

我能得到的最接近的是使用map_agg一组key: values可以在输出中一次拉出一组.然而,理想的解决方案是不必明确列出key我想要输出的每一个,而是爆炸或推出所有键kvs:

with subquery_A as (
  select 
    id,   
    map_agg(A.key, A.value) as "kvs"
  from A as a
  group by 1
)

select 
  sub_a.id,
  sub_a.kvs['a'],
  sub_a.kvs['b']

from subquery_A as sub_a
Run Code Online (Sandbox Code Playgroud)

Pel*_*lin 5

显然 Prestodb 尚未实现 PIVOT 功能。

你可以像下面这样做。它与您的解决方案类似,但可能更干净一些:

SELECT
  id,
  key['a'] AS A,
  key['b'] AS B
FROM (
  SELECT id, map_agg(key, value) key
  FROM table_a
  GROUP BY id
) temp
Run Code Online (Sandbox Code Playgroud)