通过旋转将 Presto 列转换为行



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

相关内容

  • 没有找到相关文章

最新更新