sql >> Databáze >  >> RDS >> PostgreSQL

Zřetězit/sloučit hodnoty pole během seskupování/agregace

Vlastní agregát

Přístup 1:definujte vlastní agregát. Zde je jeden, který jsem napsal dříve.

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;

LATERAL dotaz

... nebo protože nechcete zachovat objednávku a chcete deduplikovat, můžete použít LATERAL dotaz jako:

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

v takovém případě nepotřebujete vlastní agregát. Tento je pravděpodobně o něco pomalejší pro velké soubory dat kvůli deduplikaci. Odstranění ORDER BY pokud to není nutné, může pomoci.



  1. Vložit všechna data datagridview do databáze najednou

  2. Jak vytvořit tabulku s omezením cizího klíče v SQL Server - SQL Server / TSQL výukový program, část 66

  3. efektivní způsob, jak otestovat, zda existuje řádek tabulky

  4. Jak extrahovat nebo převádět časová data z řetězce v SQL Server