sql - 通过旋转将 Presto 列转换为行

标签 sql string pivot 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

关于sql - 通过旋转将 Presto 列转换为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51977699/

相关文章:

python - 将字符串作为项目添加到 QT/Python 中的 qtableWidget

java - 连续编辑文本文件的便捷方法是什么

r - 通过多列更广泛地旋转

mysql - mysql 数据透视查询结果中缺少行

SQL 服务器 : Crosstab/Pivot Price List

sql - 在 java derby DB 中从 INTEGER 转换 CHAR

sql - PostgreSQL 插入用户定义对象数组并从中选择

javascript - 查找月份在 JavaScript 循环中出现五次的时间(日期、字符串)

sql - 一个大表或规范化的两个表插入选择性能

sql - Oracle动态DESC和ASC按顺序排列