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

Concatena più righe di risultati di una colonna in una, raggruppa per un'altra colonna

Più semplice con la funzione di aggregazione string_agg() (Postgres 9.0 o successivo):

SELECT movie, string_agg(actor, ', ') AS actor_list
FROM   tbl
GROUP  BY 1;

Il 1 in GROUP BY 1 è un riferimento posizionale e una scorciatoia per GROUP BY movie in questo caso.

string_agg() prevede il tipo di dati text come input. Altri tipi devono essere espressi in modo esplicito (actor::text ) - a meno che un cast implicito a text è definito, come nel caso di tutti gli altri tipi di carattere (varchar , character , "char" ), e alcuni altri tipi.

Come ha commentato isapir, puoi aggiungere un ORDER BY clausola nella chiamata aggregata per ottenere un elenco ordinato, se necessario. Come:

SELECT movie, string_agg(actor, ', ' ORDER BY actor) AS actor_list
FROM   tbl
GROUP  BY 1;

Ma in genere è più veloce ordinare le righe in una sottoquery. Vedi:

  • Postgres SQL - Crea array in Seleziona