PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Concatena/unisci i valori dell'array durante il raggruppamento/aggregazione

Aggregato personalizzato

Approccio 1:definire un aggregato personalizzato. Eccone uno che ho scritto prima.

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;

Query LATERALE

... o dato che non vuoi preservare l'ordine e vuoi deduplicare, puoi usare un LATERAL query come:

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

in tal caso non è necessario l'aggregato personalizzato. Questo è probabilmente un po' più lento per i big data set a causa della deduplica. Rimozione del ORDER BY se non richiesto può aiutare, però.