通过旋转将Presto列变成行

时间:2018-08-23 02:51:28

标签: sql presto

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

我很高兴知道SQL或Presto中的正确功能,当然,如果可能的话。最好采用一种不涉及为所需的row =>列手动添加子句的方式。必须有一种自动执行此操作的方法,或者提供一个值列表来过滤要转换为标题的行(如下面的'a'变成列标题一样)

table_a

id | key | value

 0 |   'a'  |   1
 1 |   'b'  |   2

然后变为desired

id | 'a' | 'b' 
 0    1    2

我能得到的最接近的结果是使用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

2 个答案:

答案 0 :(得分:1)

在几乎所有数据库服务器中,查询返回一组固定的列。 RDBMS需要知道它将需要输出哪些列以正确处理查询。

因此,通常需要明确定义输出列。

您的解决方案似乎在Presto DB上运行良好。以防万一,您想将其与其他对象进行比较,这是标准SQL中的一种典型解决方案,该解决方案使用条件聚合在一组(固定)列上旋转数据。它不使用CTE,并且大多数RDBMS支持此语法。

SELECT
    id,
    MAX(CASE WHEN key = 'a' THEN value END) AS a
    MAX(CASE WHEN key = 'b' THEN value END) AS b
FROM table_a 
GROUP BY id

答案 1 :(得分:0)

显然,尚未为Prestodb实现PIVOT功能。

您可以像下面这样。它类似于您的解决方案,但可能更清洁:

IFS="$(printf '\n\r')"
相关问题