고유 제한 조건이 잘못 설정되었고 중복 행이 테이블에 들어간 것으로 나타났습니다. 내가 값을 병합하여 테이블을 해결하기 위해 노력하고있어 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는 타임 스탬프입니다 :
타임 스탬프 –
에 대한 내 응답을 편집하고 있습니다. 열 arg에 형식 캐스트를 추가하여 'string_agg'로 만든 다음 split_part' 결과를 캐스팅했습니다. – Daenyth