2014-10-30 39 views
4

我是新来的postgreSQL。我的目标是运行一个查询,该查询返回列出的每个proposal_id的所有item_id,其中每个唯一的proposal_id是单独的行条目,并且每个item_id都是该行条目中的列。将postgreSQL中的多行组合成一行?

表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加入其他数据。

任何帮助非常感谢。

谢谢!

编辑:固定台美学

+0

我想加入额外的数据将与您现有的表的设计更加容易。你能告诉我们你想加入什么吗? – cha 2014-10-30 22:31:40

+0

在相同的proposal_id内,item_id的顺序是否重要?如果是的话,你可能应该在同一个proposal_id – Alexandros 2014-10-30 22:47:38

回答

6

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

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

接下来,执行有足够数量的以下查询。

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

+0

内添加一个额外的字段谢谢 - 这真的很有帮助。 好奇,为什么在那里有一个“z”? – 2014-10-31 00:29:01

+0

from子句中的子查询必须具有别名。我不知道为什么z :) – klin 2014-10-31 02:27:31