source

Postgresql GROUP_CONCAT 등가물?

manysource 2023. 4. 15. 09:04

Postgresql GROUP_CONCAT 등가물?

테이블이 있는데 필드 값을 연결한 상태에서 id당 한 행을 가져오고 싶습니다.

예를 들어 테이블에는 다음과 같은 것이 있습니다.

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하지만 여기선 안 통할 것 같아요Postgre와 동등한 것이 있습니까?SQL 또는 이를 위한 다른 방법?

9.0 이후로는 이 작업이 더욱 쉬워졌습니다.

SELECT id, 
       string_agg(some_column, ',')
FROM the_table
GROUP BY id

여기서 시작하는 것이 좋습니다(버전 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 = '{}'
);

(우편지에서 인용)SQL 문서)

설명:

  • 텍스트에 배열을 캐스팅하면 결과 문자열이 콜리 괄호로 시작되고 끝납니다.이러한 가새들은 바람직하지 않은 경우 어떤 방법으로든 분리해야 합니다.
  • 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_field(value_field::text)가 필요합니다.array_agg() 메서드에서는 (값당 캐스트가 아니라) 집약 후에1개의 캐스트만 필요합니다.
SELECT array_to_string(array(SELECT a FROM b),', ');

그것도 괜찮겠지.

다음과 같이 시도합니다.

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

테이블 your_table에 3개의 열(이름, ID, 값)이 있다고 가정하면 쿼리는 다음과 같습니다.

  select name, 
         array_to_string(array_agg(id), ','), 
         array_to_string(array_agg(value), ',')
    from your_table
group by name
order by name
;

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

KI

및 어레이 타입으로 동작하는 버전:

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

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   

제 경험상 칼럼 타입은 비긴트였습니다.그래서 나는 아래 코드가 통했다.Postgre를 사용하고 있습니다.SQL 12.

여기서 활자 캐스팅이 이루어지고 있습니다. (:: 텍스트).

string_agg(some_column::text, ',')

아래 Oracle 쿼리가 작동하기를 바랍니다.

Select First_column,LISTAGG(second_column,',') 
    WITHIN GROUP (ORDER BY second_column) as Sec_column, 
    LISTAGG(third_column,',') 
    WITHIN GROUP (ORDER BY second_column) as thrd_column 
FROM tablename 
GROUP BY first_column

언급URL : https://stackoverflow.com/questions/2560946/postgresql-group-concat-equivalent