303

テーブルがあり、フィールド値が連結された ID ごとに 1 つの行を取得したいと考えています。

たとえば、私のテーブルには次のようなものがあります。

TM67 | 4  | 32556
TM67 | 9  | 98200
TM67 | 72 | 22300
TM99 | 2  | 23009
TM99 | 3  | 11200

そして、私は出力したいと思います:

TM67 | 4,9,72 | 32556,98200,22300
TM99 | 2,3    | 23009,11200

MySQL では集計関数を使用できましたGROUP_CONCATが、ここでは機能しないようです... PostgreSQL に相当するもの、またはこれを達成する別の方法はありますか?

4

8 に答える 8

315

9.0 以降、これはさらに簡単になりました。

SELECT id, 
       string_agg(some_column, ',')
FROM the_table
GROUP BY id
于 2012-01-10T12:51:18.730 に答える
287

これはおそらく良い出発点です(バージョン8.4以降のみ):

SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field

array_aggは配列を返しますが、それをキャストしてテキストに変換し、必要に応じて編集することができます(以下の説明を参照)。

バージョン8.4より前では、使用する前に自分で定義する必要があります。

CREATE AGGREGATE array_agg (anyelement)
(
    sfunc = array_append,
    stype = anyarray,
    initcond = '{}'
);

(PostgreSQLのドキュメントから言い換えます)

明確化:

  • 配列をテキストにキャストした結果、結果の文字列は中括弧で始まり、中括弧で終わります。これらのブレースは、望ましくない場合は、何らかの方法で削除する必要があります。
  • ANYARRAYをTEXTにキャストすると、CSV出力が最もよくシミュレートされます。これは、カンマが埋め込まれている要素が標準のCSVスタイルの出力で二重引用符で囲まれているためです。array_to_string()もstring_agg()(9.1で追加された「group_concat」関数)も、コンマが埋め込まれた文字列を引用しないため、結果のリストの要素数が正しくなくなります。
  • 新しい9.1string_agg()関数は、最初に内部結果をTEXTにキャストしません。したがって、value_fieldが整数の場合、「string_agg(value_field)」はエラーを生成します。「string_agg(value_field :: text)」が必要になります。array_agg()メソッドは、(値ごとのキャストではなく)集計後に1つのキャストのみを必要とします。
于 2010-04-01T14:55:47.977 に答える
54
SELECT array_to_string(array(SELECT a FROM b),', ');

同様に行います。

于 2010-12-17T09:07:34.557 に答える
22

このようにしてみてください:

select field1, array_to_string(array_agg(field2), ',')
from table1
group by field1;
于 2014-01-11T14:36:26.653 に答える