Fungsi agregat standar array_agg()
hanya berfungsi untuk tipe dasar, bukan tipe array sebagai input.(Tapi Postgres 9.5+ memiliki varian baru array_agg()
itu bisa!)
Anda dapat menggunakan fungsi agregat khusus array_agg_mult()
sebagaimana didefinisikan dalam jawaban terkait ini:
Memilih data ke dalam array Postgres
Buat sekali per database. Maka kueri Anda dapat berfungsi seperti ini:
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;
Ada alasan terperinci dalam jawaban yang ditautkan.
Ekstensi harus cocok
Menanggapi komentar Anda, pertimbangkan kutipan ini dari manual tentang tipe array:
Array multidimensi harus memiliki luas yang cocok untuk setiap dimensi. Ketidakcocokan menyebabkan kesalahan.
Tidak ada jalan lain, tipe array tidak mengizinkan ketidakcocokan seperti itu di Postgres. Anda bisa pad array Anda dengan nilai NULL sehingga semua dimensi memiliki luasan yang cocok.
Tapi saya lebih suka menerjemahkan array ke daftar yang dipisahkan koma dengan array_to_string()
untuk tujuan kueri ini dan gunakan string_agg()
untuk menggabungkan text
- sebaiknya dengan pemisah yang berbeda. Menggunakan baris baru dalam contoh saya:
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 ...
Menormalkan
Anda mungkin ingin mempertimbangkan untuk menormalkan skema Anda untuk memulai. Biasanya, Anda akan menerapkan hubungan n:m seperti itu dengan tabel terpisah seperti yang diuraikan dalam contoh ini:
Bagaimana cara menerapkan hubungan banyak ke banyak di PostgreSQL?