postgresql 如何将多行组合到一行中

s5a0g9ez  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(198)

我使用了交叉表函数,结果得到了一个每行只有一个列值的表。

|  ID  |  c1  |  c2  |  c3  |
-----------------------------
|  1   |      |  1   |      |
|  1   |  4   |      |      |
|  1   |      |      |  12  |
|  15  |  2   |      |      |
|  15  |      |      |  3   |

并希望更改它,以便ID是不同的,并且所有值都在同一行上:

|  ID  |  c1  |  c2  |  c3  |
-----------------------------
|  1   |  4   |  1   |  12  |
|  15  |  2   |      |  3   |

最好的办法是什么?我可以使用SUMGROUP BY id这样的聚合函数,但这会导致不必要的计算。

kknvjkwl

kknvjkwl1#

基本上,使用来自附加模块tablefunccrosstab()

SELECT *
FROM   crosstab(
   'SELECT id, key, value
    FROM   tbl
    ORDER  BY 1' -- !

  , $$VALUES ('c1'), ('c2'), ('c3')$$
   ) AS ct ("ID" text, c1 int, c2 int, c3 int);

参见(详细说明):

  • 使用Tablefunc透视多列

或者使用纯SQL:

SELECT id
     , min(value) FILTER (WHERE key = 'c1') AS c1
     , min(value) FILTER (WHERE key = 'c2') AS c2
     , min(value) FILTER (WHERE key = 'c3') AS c3
FROM   tbl
ORDER  BY 1;

可以选择将WHERE key = ANY('{c1,c2,c3}')添加到每个查询。
适应您实际的、未公开的数据类型和要求。
每个人都有自己的优点和缺点。参见:

相关问题