標準の集計関数array_agg()
入力としての配列タイプではなく、基本タイプに対してのみ機能します(ただし、 Postgres 9.5+ array_agg()
の新しいバリアントがあります できます!)
カスタム集計関数array_agg_mult()
を使用できます この関連する回答で定義されているように:
Postgres配列へのデータの選択
データベースごとに1回作成します。次に、クエリは次のように機能します。
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で多対多の関係を実装するにはどうすればよいですか?