计算项目并创建一个数组

时间:2012-06-20 16:11:17

标签: sql postgresql aggregate-functions

我有两列A和B,并希望获得B列中项目列表(及其计数),并按A列中的项目分组,并创建一个包含该信息的新表格。所以新表看起来像:

newCol1 | newCol2
--------+--------
a1,     | b1:3,b4:1,b7:11
a2,     | b2:1,b3:5,b4:3,b8:2

......等等。 (但是分隔符可以是任何东西。如果不能连接项目和计数,我也可以有一个列有项目列表,另一列有一个由分隔符分隔的计数列表。)

我可以在Java中通过首先获取所有项目并将它们存储在带有计数更新的映射中,然后更新新表,但我想知道是否有任何方法可以在PostgreSQL中执行此操作(可能通过编写功能)。

我看过PostgreSQL中的数组函数但是没有达到目的。任何指针以及存储此类数据的建议都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

你没有提供任何表格定义,也没有提供输入数据(这应该会产生你的输出)所以这只是一个黑暗的镜头:

select a, string_agg(b||':'||to_char(b_count), ',)
from (
   select a, 
          b,
          count(b) over (partition by a) as b_count,
   from the_unknown_table
) t
group by a

答案 1 :(得分:1)

我假设

ab的类型为text

SELECT a, array_agg(bs) AS b_list
FROM  (
    SELECT a, b || ':' || count(*) AS bs  -- coerced to text automatically
    FROM   tbl
    GROUP  BY a, b
    ORDER  BY a, b   -- to sort b_list in the result
    ) x
GROUP  BY a;

或者使用string_agg()作为@a_horse演示来获取字符串而不是数组。