PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Array-Werte während der Gruppierung/Aggregation verketten/zusammenführen

Benutzerdefiniertes Aggregat

Ansatz 1:Definieren Sie ein benutzerdefiniertes Aggregat. Hier ist eine, die ich vorhin geschrieben habe.

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;

SEITLICHE Abfrage

... oder da Sie die Reihenfolge nicht wahren und deduplizieren möchten, könnten Sie einen LATERAL verwenden Abfrage wie:

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

In diesem Fall benötigen Sie das benutzerdefinierte Aggregat nicht. Dieser ist aufgrund der Deduplizierung wahrscheinlich etwas langsamer für große Datensätze. Entfernen des ORDER BY wenn nicht erforderlich, kann es aber helfen.