web-dev-qa-db-ja.com

2つのPostgreSQL列を角かっこで区切られた配列に集約する方法

Group-byクエリを使用して2つの列を連結して、括弧で区切られた配列を作成したいと思います。この質問は this の質問に関連していることは知っていますが、いつものように私のユースケースは少し異なります。

簡単な例( SQL Fiddle としても)。現在、私のクエリは次を返します:

_ID  X   Y
3   0.5 2.71
3   1.0 2.50
3   1.5 2.33
6   0.5 2.73
6   1.5 2.77
_

しかし、次を取得するためにX/Y列を連結/集約したい場合:

_ID  XY
3   [[0.5,2.71],[1.0,2.50],[1.5,2.33]]
6   [[0.5,2.73],[1.5,2.77]]
_

現在、次のように列を1つに連結しようとしました。

_SELECT "ID",concat_ws(', ',"X", "Y") as XY FROM Table1;
_

返されるもの:

_ID  xy
3   0.5, 2.71
3   1, 2.50
3   1.5, 2.33
6   0.5, 2.73
_

使用されたarray_agg()

_SELECT "ID",array_to_string(array_agg("X"),',') AS XY
FROM Table1
GROUP BY "ID";
_

その結果:

_ID  xy
3   0.5,1,1.5
6   0.5
_

近づいてきているように感じますが、助けてくれる人は本当にありがたいです。

14
Mattijn

2つの列から配列を作成し、配列を集約します。

select id, array_agg(array[x,y])
from the_table
group by id;

配列のデフォルトのテキスト表現では、中括弧({..})角括弧ではありません([..]

18

Postgresでは9.5以降array_agg()は入力としてarraysを使用して単純な構文 @ a_horseで提供

SELECT id, array_agg(ARRAY[x, y]) AS xy
FROM   Table1
GROUP  BY id;

古いバージョンでは、これはまだ実装されていません。同じことを達成するために、独自の集約関数を作成できます(一度)。

CREATE AGGREGATE array_agg_mult (anyarray)  (
    SFUNC     = array_cat
  , STYPE     = anyarray
  , INITCOND  = '{}'
);

次に:

SELECT id, array_agg_mult(ARRAY[ARRAY[x,y]]) AS xy  -- note the 2D array
FROM   Table1
GROUP  BY id;

詳細:

または、文字列を連結できます:

SELECT id, '[[' || string_agg(concat_ws(',', x, y), '],[') || ']]' AS xy
FROM   Table1
GROUP  BY id;

希望する結果を正確に生成します。配列ではなく文字列。

5