PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Concatenar/mesclar valores de matriz durante o agrupamento/agregação

Agregado personalizado


Abordagem 1:defina um agregado personalizado. Aqui está um que escrevi anteriormente.
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;

consulta LATERAL


... ou como você não deseja preservar a ordem e deseja desduplicar, você pode usar um LATERAL consulta como:
SELECT title, array_agg(DISTINCT tag ORDER BY tag) 
FROM my_test, unnest(tags) tag 
GROUP BY title;

nesse caso, você não precisa do agregado personalizado. Este é provavelmente um pouco mais lento para conjuntos de big data devido à desduplicação. Removendo o ORDER BY se não for necessário pode ajudar, no entanto.