Standardní agregační funkce array_agg()
funguje pouze pro základní typy, nikoli pro typy polí jako vstup. (Ale Postgres 9.5+ má novou variantu array_agg()
to může!)
Můžete použít vlastní agregační funkci array_agg_mult()
jak je definováno v této související odpovědi:
Výběr dat do pole Postgres
Vytvořte jej jednou pro každou databázi. Pak by váš dotaz mohl fungovat takto:
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;
V propojené odpovědi je podrobné zdůvodnění.
Rozsahy se musí shodovat
V reakci na váš komentář zvažte tento citát z příručky o typech polí:
Vícerozměrná pole musí mít odpovídající rozsahy pro každou dimenzi. Neshoda způsobí chybu.
To nejde nijak obejít, typ pole takovou neshodu v Postgresu neumožňuje. Mohli byste vyplňte pole hodnotami NULL, aby všechny dimenze měly odpovídající rozsahy.
Ale raději bych pole přeložil na seznamy oddělené čárkami pomocí array_to_string()
pro účely tohoto dotazu použijte string_agg()
agregovat text
- nejlépe s jiným separátorem. Použití nového řádku v mém příkladu:
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 ...
Normalizovat
Možná budete chtít nejprve zvážit normalizaci schématu. Obvykle byste takový vztah n:m implementovali se samostatnou tabulkou, jak je uvedeno v tomto příkladu:
Jak implementovat vztah many-to-many v PostgreSQL?