我有一个数组列类型的表:

 title       tags
"ridealong";"{comedy,other}"
"ridealong";"{comedy,tragedy}"
"freddyjason";"{horror,silliness}"

我想编写一个查询, for each 标题生成一个数组(在理想情况下,它将是一个集/消除重复的数组)

例如

select array_cat(tags),title from my_test group by title

当然,上面的查询不起作用,但我想生成两行:

"ridealong";"{comedy,other,tragedy}"
"freddyjason";"{horror,silliness}"

任何帮助或指点都将不胜感激


基于Craig的帮助,我最终得出了以下结论(自9.1版完全按照他所展示的方式投诉查询以来,语法略有改变)

SELECT t1.title, array_agg(DISTINCT tag.tag) 
FROM my_test t1, (select unnest(tags) as tag,title from my_test) as tag 
where tag.title=t1.title
GROUP BY t1.title;

推荐答案

自定义聚合

方法1:定义自定义聚合.Here's one I wrote earlier

CREATE TABLE my_test(title text, tags text[]);

INSERT INTO my_test(title, tags) VALUES
('ridealong', '{comedy,other}'),
('ridealong', '{comedy,tragedy}'),
('freddyjason', '{horror,silliness}');

CREATE AGGREGATE array_cat_agg(anyarray) (
  SFUNC=array_cat,
  STYPE=anyarray
);

select title, array_cat_agg(tags) from my_test group by title;

横向询问

... 或者,由于您不想保留顺序,也不想进行重复数据消除,因此可以使用LATERAL查询,如:

SELECT title, array_agg(DISTINCT tag ORDER BY tag) 
FROM my_test, unnest(tags) tag 
GROUP BY title;

在这种情况下,您不需要自定义聚合.由于重复数据消除,对于 Big Data 集来说,这可能会稍微慢一点.不过,如果不需要,移除ORDER BY可能会有所帮助.

Postgresql相关问答推荐

如何在Postgres中对分区表使用Hibernate验证?

如何在PostgreSQL中更改分区的表空间?

如何返回old_ids和重复行的映射';来自PostgreSQL函数的s new_id

在插入时创建一个触发器,在PostgreSQL中的另一个表上创建另一个触发器

忽略 split_part 的第 n 个分隔符之后

使用Helm设置PostgreSQL配置

使用来自 docker 图像的 postgres 设置 Keycloak 21

Postgres 函数 now() 返回不正确的时区偏移量

如何计算每月的出版物数量?

GORM 不会创建 many2many 关联

Nodemon - 安装期间clean exit - waiting for changes before restart

什么是 postgres 超级用户

Docker Compose + Spring Boot + Postgres 连接

Postgres 在 WHERE id != int 查询中排除 NULL

在函数中返回字段作为插入结果

从 PostgreSQL 中的字段中提取数字

null 计算结果为 false 的情况

如何缩小 pg_toast 表?

Postgres:为 CAST 失败定义一个默认值?

如何在 postgresql 中获取整个表的哈希?