1. ホーム
  2. postgresql

[解決済み] PostgreSQLのarray_aggオーダー

2022-06-25 04:19:27

質問

テーブル「動物」。

animal_name animal_type
Tom         Cat
Jerry       Mouse
Kermit      Frog

クエリ

SELECT 
array_to_string(array_agg(animal_name),';') animal_names,
array_to_string(array_agg(animal_type),';') animal_types
FROM animals;

期待される結果

Tom;Jerry;Kerimt, Cat;Mouse;Frog
OR
Tom;Kerimt;Jerry, Cat;Frog;Mouse

最初の集計関数の順序が常に2番目と同じであることを確認できますか。 つまり、私は取得したいとは思いません。

Tom;Jerry;Kermit, Frog;Mouse,Cat

どのように解決するのですか?

PostgreSQL のバージョン < 9.0 を使用している場合。

からです。 http://www.postgresql.org/docs/8.4/static/functions-aggregate.html

<ブロッククオート

現在の実装では、原則的に入力の順番は指定されていません。しかし、ソートされたサブクエリから入力値を供給することは、通常うまくいきます。例えば

SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab.SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;

ということで、あなたの場合はこう書きます。

SELECT
array_to_string(array_agg(animal_name),';') animal_names,
array_to_string(array_agg(animal_type),';') animal_types
FROM (SELECT animal_name, animal_type FROM animals) AS x;

そうすると、array_aggへの入力は順序付けされないが、両方の列で同じになる。そして、もしあなたが好きなら ORDER BY 節をサブクエリに追加することもできます。