PostgreSQLのarray_aggの順序


106

テーブル「動物」:

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

7
あなたが9.0である場合は、単一で、ネストされた通話置き換えることができますstring_agg()
a_horse_with_no_name

回答:


27

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
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て、サブクエリに句を追加できます。


328

マニュアルの次の例のように、ORDER BYを使用します

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

41
注:ORDER BYin array_aggはPostgreSQL 9で導入されました
UlfR

6
PostgreSQL 9+を想定した承認済みの回答よりもはるかに優れています。
エリック

1
selectにORDER BYを使用してサンプルを提供してください。SELECTarray_agg(animal_name)、array_agg(animal_type)FROM animals; ?
Grigory Kislin 2014年

8
これがないことに注意してくださいではないために働くarray_agg(DISTINCT a ORDER BY b)
CERD

1
複数の列のために使用するときには、括弧を追加する必要があります:array_agg((a, b, c) ORDER BY b)
bennos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.