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 또는 이를 위한 다른 방법?
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
'source' 카테고리의 다른 글
Bash를 사용하여 변수에 현재 디렉토리를 저장하시겠습니까? (0) | 2023.04.15 |
---|---|
receiver type *** (인스턴스 메시지)는 전달 선언입니다. (0) | 2023.04.15 |
Swift에서 어레이의 처음 5개 개체를 반환하는 방법 (0) | 2023.04.15 |
이름 "XYZ"가 네임스페이스 "clr-namespace"에 없습니다.ABC" (0) | 2023.04.15 |
"{Binding Path="입니다.}"와 "{Binding}"이(가) 완전히 동일합니다. (0) | 2023.04.15 |