0

我有两列 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 中的数组函数,但没有走多远。任何指针以及存储此类数据的建议将不胜感激。

4

2 回答 2

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
于 2012-06-20T17:47:35.950 回答
1

a并且b是 type 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 演示来获取字符串而不是数组作为结果。

于 2012-06-20T17:52:45.613 回答