sql – 在分组/聚合期间连接/合并数组值

我有一个数组列类型的表:
title       tags
"ridealong";"{comedy,other}"
"ridealong";"{comedy,tragedy}"
"freddyjason";"{horror,silliness}"

我想编写一个查询,每个标题生成一个数组(理想情况下,它将是一个set / deduplicated数组)

例如

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

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

"ridealong";"{comedy,other,silliness}"

任何帮助或指示将非常感谢
(我正在使用Postgres 9.1)

基于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',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查询

…或者由于您不想保留订单并希望进行重复数据删除,您可以使用LAteraL查询,例如:

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

在这种情况下,您不需要自定义聚合.由于重复数据删除,这对于大数据集来说可能要慢得多.但是,如果不需要,删除ORDER BY可能会有所帮助.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...