首页 > 解决方案 > 使用许多键在 PostgreSQL 中透视表

问题描述

我正在旋转表格 , 的表格,id其中有多种类型的键 (130)。有太多键来显式枚举调用中的类型,或者按照交叉表文档中的建议写出函数定义:keyvaluecrosstab()crosstab_N

    row_name TEXT,
    category_1 TEXT,
    category_2 TEXT,
        .
        .
        .
    category_N TEXT
);

如何将此表转换为具有列 id、category_1、category_2、... category_130 的宽格式?我很难相信如果不显式枚举列类型就无法在 SQL 中对此类表进行透视。例如在 R 中,使用tidyverse我会调用的包dataframe %>% spread(key=key, value=value)

标签: sqlpostgresqlpivotentity-attribute-value

解决方案


我很难相信如果不显式枚举列类型就无法在 SQL 中对此类表进行透视。

SQL 查询返回一组固定的列。SQL 是一种描述性语言,您需要告诉数据库您想要结果集中的哪些列,以便它能够理解您的需求,并构建正确的查询计划。

典型的解决方案涉及动态SQL:即使用查询生成实际的查询字符串,然后执行它。这是一个额外的间接级别,这可能具有一定的挑战性。

一种中途解决方案是 JSON。如果您可以接受所有键/对值都聚合在 JSON 对象的单个列中的结果,您可以执行以下操作:

select id, json_object_agg(key, value) obj
from mytable
group by id

推荐阅读