我希望在此示例数据中获取与每个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[]
这里有什么正确的方法?我想要所有的单词,甚至是重复的单词。
答案 0 :(得分:5)
array_agg
将列的结果收集到数组中;它没有聚合数组。
array_cat
是您想要的功能,但它不是一个集合功能。
要根据它定义自己的聚合,请使用以下代码:
CREATE AGGREGATE array_cat_aggregate (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
我公然抄袭了这个答案:https://stackoverflow.com/a/11763245/1394393。 (我不认为这个问题是重复的。)
假装该表名为temp
,然后您可以选择使用GROUP BY
的函数:
SELECT id, array_cat_aggregate(words)
FROM temp
GROUP BY id;
这里有一个SQL小提琴:http://sqlfiddle.com/#!12/7c828/1/0
答案 1 :(得分: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;