这是所需的输入和所需的输出。我不熟悉 SQL 或 Presto 中使用的术语,文档似乎指向使用map_agg
但我认为这里的问题是动态创建列,但很好奇这是否可能在a, b, ...
列已知且有限的情况下。
我很高兴知道SQL或Presto中正确的功能,当然如果这可能的话。最好以不涉及为每个所需行 => 列手动添加子句的方式。必须有一种方法可以自动执行此操作,或者通过提供值列表来过滤转换为标题的行(就像下面的'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
在几乎所有数据库服务器中,查询都会返回一组固定的列。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
显然 PIVOT 函数尚未为 Prestodb 实现。
你可以像下面这样做。它类似于您的解决方案,但可能更干净一些:
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