如何在PostgreSQL中将多行合并为一行?

10
我对postgreSQL不熟悉。我的目标是运行一个查询,返回每个proposal_id所列出的所有item_id,其中每个唯一的proposal_id是单独的行条目,并且每个item_id都是该行条目中的一个列。
表1数据如下:
proposal_id    item_id  

1              83054
1              81048
2              71384
2              24282
2              19847
2              18482
3              84720
4              18081
4              73018

这是我想要它看起来的样子:
proposal_id     item_id_1     item_id_2    item_id_3    item_id_4    item_id_n
1                  83054      81048
2                  71384      24282        19847        18482
3                  84720
4                  18081      73018

挑战在于我可以为任何数量的条目拥有相同的proposal_id,从1到11个或更多。
这是一个简化版本,用于提出这个问题。一旦我解决了这个问题,我的计划是从其他表中加入每个item_id和proposal_id的附加数据。
非常感谢任何帮助。
谢谢!
编辑:修复了表格美学。

我认为使用您现有的表设计加入其他数据会更容易。您能展示一下您想要加入的内容吗? - cha
同一proposal_id中,item_id的顺序重要吗?如果是,则您可能需要添加一个额外的字段,表示同一proposal_id中的顺序。 - Alexandros
1个回答

14

首先,确定您需要多少列:

select proposal_id, array_length(array_agg(item_id), 1)
    from the_table
    group by 1
    order by 2 desc
    limit 1

接下来,请使用足够数量的 "a" 执行以下查询。

select proposal_id, a[1] id1, a[2] id2, a[3] id3, a[4] id4
from (
    select proposal_id, array_agg(item_id) a
    from the_table
    group by 1
    order by 1) z

SQLFiddle


谢谢 - 这真的很有帮助。好奇,为什么末尾有一个“z”? - Nick Lashinsky
1
FROM子句中的子查询必须有一个别名。我不知道为什么z :)。 - klin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接