PostgreSQL: 聚合文本数组

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[]

这里应该采取什么正确的方法呢?我想要所有单词,包括重复的。

2个回答

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

array_cat 是你需要的功能,但它不是一个聚合函数。

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

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

以下是我从这个答案中直接复制的内容:https://dev59.com/02gt5IYBdhLWcg3w3xEw#11763245。 (我认为这个问题不是重复的。)

假设表名为temp,你可以使用带有GROUP BY函数的选择语句:

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

这里有一个SQL Fiddle链接供您参考:http://sqlfiddle.com/#!12/7c828/1/0


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;

可运行的例子


我想指出,这个答案比我的更好,因为它可以将数组减少到唯一值。只需要像这样添加 DISTINCTarray_agg(DISTINCT w) - jpmc26

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