这是所需的输入和所需的输出。我不熟悉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
答案 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')"