La función agregada estándar array_agg()
solo funciona para tipos base, no para tipos de matriz como entrada. (Pero Postgres 9.5+ tiene una nueva variante de array_agg()
eso puede!)
Podría usar la función agregada personalizada array_agg_mult()
como se define en esta respuesta relacionada:
Seleccionar datos en una matriz de Postgres
Créelo una vez por base de datos. Entonces su consulta podría funcionar así:
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;
Hay una justificación detallada en la respuesta vinculada.
Las extensiones deben coincidir
En respuesta a su comentario, considere esta cita del manual sobre tipos de matrices:
Las matrices multidimensionales deben tener extensiones coincidentes para cada dimensión. Una falta de coincidencia provoca un error.
No hay forma de evitarlo, el tipo de matriz no permite tal desajuste en Postgres. podrías rellene sus arreglos con valores NULOS para que todas las dimensiones tengan extensiones coincidentes.
Pero preferiría traducir las matrices a listas separadas por comas con array_to_string()
para el propósito de esta consulta y use string_agg()
para agregar el text
- preferiblemente con un separador diferente. Usando una nueva línea en mi ejemplo:
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
Es posible que desee considerar la normalización de su esquema para empezar. Por lo general, implementaría una relación n:m de este tipo con una tabla separada como se describe en este ejemplo:
¿Cómo implementar una relación de muchos a muchos en PostgreSQL?