Стандартната агрегатна функция array_agg()
работи само за базови типове, а не за типове масиви като вход.(Но Postgres 9.5+ има нов вариант на array_agg()
това може!)
Можете да използвате персонализираната агрегатна функция array_agg_mult()
както е дефинирано в този свързан отговор:
Избиране на данни в Postgres масив
Създайте го веднъж на база данни. Тогава вашата заявка може да работи по следния начин:
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;
В свързания отговор има подробна обосновка.
Разширенията трябва да съвпадат
В отговор на вашия коментар помислете за този цитат от ръководството за типовете масиви:
Многоизмерните масиви трябва да имат съвпадащи екстенти за всяко измерение. Несъответствието причинява грешка.
Няма как да заобиколите това, типът на масива не позволява такова несъответствие в Postgres. Вие можете попълнете своите масиви с NULL стойности, така че всички измерения да имат съвпадащи екстенти.
Но бих предпочел да преведа масивите в списъци, разделени със запетая, с array_to_string()
за целите на тази заявка и използвайте string_agg()
за агрегиране на text
- за предпочитане с различен разделител. Използване на нов ред в моя пример:
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 ...
Нормализиране
Може да помислите за нормализиране на вашата схема като начало. Обикновено бихте внедрили такава връзка n:m с отделна таблица, както е описано в този пример:
Как да внедрите релация много към много в PostgreSQL?