web-dev-qa-db-ja.com

PostgreSQLのarray_aggの順序

表「動物」:

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
81
Olo

PostgreSQLバージョン9.0未満の場合:

From: http://www.postgresql.org/docs/8.4/static/functions-aggregate.html

現在の実装では、入力の順序は原則として指定されていません。ただし、ソートされたサブクエリから入力値を提供することは通常機能します。例えば:

SELECT xmlagg(x)FROM(SELECT x FROMテストORDER BY y DESC)ASタブ;

だからあなたの場合、あなたは書くだろう:

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句を追加できます。

25
UlfR

manual の次の例のように、ORDER BYを使用します。

SELECT array_agg(a ORDER BY b DESC) FROM table;
267
Frank Heikens