PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Concaténer/fusionner des valeurs de tableau pendant le regroupement/l'agrégation

Agrégation personnalisée

Approche 1 :définir un agrégat personnalisé. En voici une que j'ai écrite plus tôt.

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;

Requête LATÉRALE

... ou puisque vous ne voulez pas conserver l'ordre et souhaitez dédupliquer, vous pouvez utiliser un LATERAL requête comme :

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

auquel cas vous n'avez pas besoin de l'agrégat personnalisé. Celui-ci est probablement un peu plus lent pour les grands ensembles de données en raison de la déduplication. Suppression du ORDER BY s'il n'est pas nécessaire, cela peut aider, cependant.