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
_
近づいてきているように感じますが、助けてくれる人は本当にありがたいです。
2つの列から配列を作成し、配列を集約します。
select id, array_agg(array[x,y])
from the_table
group by id;
配列のデフォルトのテキスト表現では、中括弧({..}
)角括弧ではありません([..]
)
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;
希望する結果を正確に生成します。配列ではなく文字列。