Den standardaggregerade funktionen array_agg()
fungerar bara för bastyper, inte matristyper som indata.(Men Postgres 9.5+ har en ny variant av array_agg()
det kan!)
Du kan använda den anpassade aggregatfunktionen array_agg_mult()
enligt definitionen i detta relaterade svar:
Välja data i en Postgres-array
Skapa den en gång per databas. Då kan din fråga fungera så här:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
,array_agg_mult(ARRAY[se.min_crew]) AS min_crew_arr
FROM base.sched_entry se
LEFT JOIN base.user_sched_entry use USING (sched_entry_id)
WHERE se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP BY user_sched_id;
Det finns en detaljerad motivering i det länkade svaret.
Omfattningar måste matcha
Som svar på din kommentar, överväg detta citat från manualen om arraytyper:
Flerdimensionella arrayer måste ha matchande omfattning för varje dimension. En missmatchning orsakar ett fel.
Det finns ingen väg runt det, array-typen tillåter inte en sådan missmatchning i Postgres. Du kunde fyll dina arrayer med NULL-värden så att alla dimensioner har matchande omfattning.
Men jag skulle hellre översätta arrayerna till kommaseparerade listor med array_to_string()
för denna fråga och använd string_agg()
för att samla text
- helst med en annan separator. Använder en nyrad i mitt exempel:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
,string_agg(array_to_string(se.min_crew, ','), E'\n') AS min_crews
FROM ...
Normalisera
Du kanske vill överväga att normalisera ditt schema till att börja med. Vanligtvis skulle du implementera en sådan n:m-relation med en separat tabell som beskrivs i det här exemplet:
Hur implementerar man en många-till-många-relation i PostgreSQL?