2016-06-29 8 views
2

고유 제한 조건이 잘못 설정되었고 중복 행이 테이블에 들어간 것으로 나타났습니다. 내가 값을 병합하여 테이블을 해결하기 위해 노력하고있어 http://sqlfiddle.com/#!15/c4a5d/1/0테이블의 두 행을 하나로 결합하기

create table foo (
bad_id INT NOT NULL, 
real_id INT NOT NULL, 
a TEXT, 
b TEXT 
); 

insert into foo values 
(1, 1, 'a1', null), 
(2, 1, null, 'b1'), 
(3, 1, null, null), 
(4, 2, 'a22', 'b2'), 
(5, 2, 'a2', 'b22'), 
(6, 3, null, null); 

:

나는이 sqlfiddle을 설정합니다. 새로운 행이 존재하는 경우, 나는 기본적으로 내가 원하는 real_id

3 | 1 | 'a1' | 'b1' 
5 | 2 | 'a2' | 'b22' 
6 | 3 | null | null 

내가 원하는 최종 결과가 이것이다 (대신 삽입의 업데이트 있었어야) 고유의 해당 값을 먹고 싶어 첫 번째 행이 삽입 인 것처럼 보이는 최종 결과 및 동일한 real_id이있는 다음 행이 부분 업데이트되었습니다.

최종 결과 집합을 만들 때 어떤 종류의 쿼리를 사용할 수 있습니까?

저는 Postgres 9.4를 사용하고 있습니다.

SQL에서이 작업을 수행하는 데 필요한 것이 끔찍하거나 아주 나쁜 점근 성능이있는 경우 모든 행을 코드 (25000 개가 있음)로 가져 와서 수동으로 병합하여 선형 복잡성으로 처리 할 수 ​​있어야합니다. 그것은 SQL에서 가능해야하지만 것 같습니다.

코드 관점에서 볼 때 fold 작업 인 것처럼 보이므로 WITH RECURSIVE cte가 여기에 도움이됩니까?

select max(bad_id), 
    split_part(string_agg(a,'__SPLITER__' order by bad_id DESC),'__SPLITER__',1) 
    ,split_part(string_agg(b,'__SPLITER__' order by bad_id DESC),'__SPLITER__',1) 
    from foo group by real_id 

경우 b는 타임 스탬프입니다 :

답변

2

이 시도 정수

select max(bad_id), 
     split_part(string_agg(a::character varying,'__SPLITER__' order by bad_id DESC),'__SPLITER__',1)::timestamp, 
     split_part(string_agg(b::character varying,'__SPLITER__' order by bad_id DESC),'__SPLITER__',1)::timestamp 
    from foo group by real_id 

같은 : split_part (string_agg (A : 문자 ..., 1) : 정수를 변화

+0

타임 스탬프 –

+0

에 대한 내 응답을 편집하고 있습니다. 열 arg에 형식 캐스트를 추가하여 'string_agg'로 만든 다음 split_part' 결과를 캐스팅했습니다. – Daenyth