A função agregada padrão
array_agg()
funciona apenas para tipos base, não para tipos de matriz como entrada.(Mas Postgres 9.5+ tem uma nova variante de array_agg()
que pode!) Você pode usar a função de agregação personalizada
array_agg_mult()
conforme definido nesta resposta relacionada:Selecionando dados em um array Postgres
Crie-o uma vez por banco de dados. Então sua consulta poderia funcionar assim:
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;
Há uma justificativa detalhada na resposta vinculada.
As extensões precisam corresponder
Em resposta ao seu comentário, considere esta citação do manual sobre tipos de array:
As matrizes multidimensionais devem ter extensões correspondentes para cada dimensão. Uma incompatibilidade causa um erro.
Não há como contornar isso, o tipo array não permite essa incompatibilidade no Postgres. Você poderia preencha seus arrays com valores NULL para que todas as dimensões tenham extensões correspondentes.
Mas eu prefiro traduzir os arrays para uma lista separada por vírgulas com
array_to_string()
para esta consulta e use string_agg()
para agregar o text
- de preferência com um separador diferente. Usando uma nova linha no meu exemplo: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 ...
Normalizar
Você pode querer considerar normalizar seu esquema para começar. Normalmente, você implementaria um relacionamento n:m com uma tabela separada, conforme descrito neste exemplo:
Como implementar um relacionamento muitos-para-muitos no PostgreSQL?