4

agg_testと の3 つの列idを持つ単純なテーブルがあるcolumn_1としcolumn_2ます。たとえば、次のようなデータセットです。

id|column_1|column_2
--------------------
 1|       1|       1
 2|       1|       2
 3|       1|       3
 4|       1|       4
 5|       2|       1
 6|       3|       2
 7|       4|       3
 8|       4|       4
 9|       5|       3
10|       5|       4 

次のようなクエリ (自己結合あり):

SELECT
  a1.column_1,
  a2.column_1,
  ARRAY_AGG(DISTINCT a1.column_2 ORDER BY a1.column_2)
FROM agg_test a1
JOIN agg_test a2 ON a1.column_2 = a2.column_2 AND a1.column_1 <> a2.column_1
WHERE a1.column_1 = 1
GROUP BY a1.column_1, a2.column_1

次のような結果が生成されます。

column_1|column_1|array_agg
---------------------------
       1|       2|      {1}
       1|       3|      {2}
       1|       4|    {3,4}
       1|       5|    {3,4}

結合されたテーブルの値 4 と 5 について、最後の列に同じ結果があることがわかります。それで、どういうわけかそれによって結果をグループ化することは可能ですか?例えば:

column_1|column_1|array_agg
---------------------------
       1|     {2}|      {1}
       1|     {3}|      {2}
       1|   {4,5}|    {3,4}

回答ありがとうございます。何か不明な点がある場合、またはより良い方法で提示できる場合は、コメントで教えてください。この質問をできるだけ読みやすくするようにします.

4

2 に答える 2

4

配列で集計できるかどうかわかりません。ここにできる場合は、1つのアプローチがあります:

select col1, array_agg(col2), ar
from (SELECT a1.column_1 as col1, a2.column_1 as col2,
             ARRAY_AGG(DISTINCT a1.column_2 ORDER BY a1.column_2) as ar
      FROM agg_test a1 JOIN
           agg_test a2
           ON a1.column_2 = a2.column_2 AND a1.column_1 <> a2.column_1
      WHERE a1.column_1 = 1
      GROUP BY a1.column_1, a2.column_1
     ) t
group by col1, ar

array_dims別の方法は、配列値を文字列に変換するために使用することです。

于 2013-03-27T15:00:32.607 に答える