web-dev-qa-db-ja.com

Postgresql GROUP_CONCATと同等ですか?

テーブルがあり、フィールド値が連結された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に相当するもの、またはこれを実現する別の方法はありますか?

217
TwixxyKit

これはおそらく良い出発点です(バージョン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.1 string_agg()関数は、最初に内部結果をTEXTにキャストしません。そのため、value_fieldが整数の場合、「string_agg(value_field)」はエラーを生成します。 「string_agg(value_field :: text)」が必要です。 array_agg()メソッドは、(値ごとのキャストではなく)集約後に1つのキャストのみを必要とします。
208
Matthew Wood

9.0以降 これはさらに簡単です:

SELECT id, 
       string_agg(some_column, ',')
FROM the_table
GROUP BY id
229
SELECT array_to_string(array(SELECT a FROM b),', ');

同様に行います。

41
genobis

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

select field1, array_to_string(array_agg(field2), ',')
from table1
group by field1;
12
max_spy

配列タイプで動作するバージョン:

select
  array_to_string(
    array(select distinct unnest(Zip_codes) from table),
    ', '
);
0

Postgresqlでの私の提案

SELECT cpf || ';' || nome || ';' || telefone  
FROM (
      SELECT cpf
            ,nome
            ,STRING_AGG(CONCAT_WS( ';' , DDD_1, TELEFONE_1),';') AS telefone 
      FROM (
            SELECT DISTINCT * 
            FROM temp_bd 
            ORDER BY cpf DESC ) AS y
      GROUP BY 1,2 ) AS x   
0
Lucas Cabral