Standard aggregatfunktionen array_agg()
virker kun for basistyper, ikke matrixtyper som input.(Men Postgres 9.5+ har en ny variant af array_agg()
det kan!)
Du kan bruge den tilpassede aggregerede funktion array_agg_mult()
som defineret i dette relaterede svar:
Valg af data i en Postgres-array
Opret det én gang pr. database. Så kunne din forespørgsel fungere sådan her:
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;
Der er en detaljeret begrundelse i det linkede svar.
Udvidelser skal matche
Som svar på din kommentar kan du overveje dette citat fra manualen om arraytyper:
Flerdimensionelle arrays skal have matchende udstrækninger for hver dimension. En uoverensstemmelse forårsager en fejl.
Det er der ingen vej uden om, array-typen tillader ikke en sådan uoverensstemmelse i Postgres. Du kunne udfyld dine arrays med NULL-værdier, så alle dimensioner har matchende udstrækninger.
Men jeg vil hellere oversætte arrays til en komma-separerede lister med array_to_string()
til formålet med denne forespørgsel og brug string_agg()
for at samle text
- gerne med en anden separator. Bruger en ny linje i mit eksempel:
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 ...
Normaliser
Du vil måske overveje at normalisere dit skema til at begynde med. Typisk vil du implementere en sådan n:m-relation med en separat tabel som beskrevet i dette eksempel:
Hvordan implementerer man en mange-til-mange-relation i PostgreSQL?