3

我想获取与id此示例数据中的每个相关联的所有单词的数组:

id | words
---|------------------
1  | {foo,bar,zap,bing}
2  | {foo}
1  | {bar,zap}
2  | {bing}
1  | {bing}
2  | {foo,bar}

输出:

id | allwords
---|--------------------------------
1  | {foo,bar,zap,bing,bar,zap,bing}
2  | {foo,bing,foo,bar}

我尝试使用array_agg(words)但它产生:

ERROR: could not find array type for data type text[]

这里的正确方法是什么?我想要所有的单词,甚至是重复的单词。

4

2 回答 2

6

array_agg将列的结果收集到一个数组中;它不聚合数组。

array_cat是您想要的功能,但它不是聚合函数。

要基于它定义自己的聚合,请使用以下代码:

CREATE AGGREGATE array_cat_aggregate (anyarray)  (
    SFUNC     = array_cat
   ,STYPE     = anyarray
   ,INITCOND  = '{}'
);

我从这个答案中公然复制:https ://stackoverflow.com/a/11763245/1394393 。(我不认为这个问题是重复的。)

假装表格被调用temp,然后您可以选择使用带有 a 的函数GROUP BY

SELECT id, array_cat_aggregate(words)
FROM temp
GROUP BY id;

这是给你的 SQL Fiddle:http ://sqlfiddle.com/#!12/7c828/1/0

于 2013-05-22T02:50:50.833 回答
2

作为 jpmc26 解决方案的替代方案,您还可以结合使用数组array_agg的子查询:unnest

SELECT id, array_agg(w) AS allwords
FROM
(
  SELECT
   id,
   unnest(words) AS w
  FROM words_table
) x
GROUP BY id;

工作小提琴

于 2013-05-22T03:02:02.783 回答