3

idこの例のデータで、それぞれに関連付けられているすべての単語の配列を取得したいと考えています。

id | words
---|------------------
1  | {foo,bar,zap,bing}
2  | {foo}
1  | {bar,zap}
2  | {bing}
1  | {bing}
2  | {foo,bar}

出力:

id | allwords
---|--------------------------------
1  | {foo,bar,zap,bing,bar,zap,bing}
2  | {foo,bing,foo,bar}

使用してみarray_agg(words)ましたが、結果は次のとおりです。

ERROR: could not find array type for data type text[]

ここで適切なアプローチは何ですか?重複を含め、すべての単語が必要です。

4

2 に答える 2

6

array_agg列の結果を配列に収集します。配列を集約しません。

array_cat必要な機能ですが、集計関数ではありません。

それに基づいて独自の集計を定義するには、次のコードを使用します。

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

この回答から露骨にコピーしました:https://stackoverflow.com/a/11763245/1394393。(質問が重複しているとは思いません。)

テーブルが呼び出されたふりをして、次tempの関数を使用して選択できますGROUP BY

SELECT id, array_cat_aggregate(words)
FROM temp
GROUP BY id;

これがあなたのためのSQLフィドルです:http://sqlfiddle.com/#!12/7c828/1/0

于 2013-05-22T02:50:50.833 に答える
2

jpmc26 ソリューションの代替として、配列array_aggのサブクエリと組み合わせることもできます。unnest

SELECT id, array_agg(w) AS allwords
FROM
(
  SELECT
   id,
   unnest(words) AS w
  FROM words_table
) x
GROUP BY id;

働くフィドル

于 2013-05-22T03:02:02.783 に答える