sql >> Base de Datos >  >> RDS >> PostgreSQL

Concatenar/combinar valores de matriz durante la agrupación/agregación

Agregado personalizado

Enfoque 1:definir un agregado personalizado. Aquí hay uno que escribí antes.

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

... o como no desea conservar el orden y quiere deduplicar, puede usar un LATERAL consulta como:

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

en cuyo caso no necesita el agregado personalizado. Este es probablemente un poco más lento para grandes conjuntos de datos debido a la deduplicación. Eliminando el ORDER BY sin embargo, si no es necesario, puede ayudar.