2016-10-14 6 views
1

단일 ID에 대해 여러 레코드를 생성하는 다음 쿼리가 있습니다.여러 레코드를 단일 레코드로 병합

:

1, M, 2000-01-01, dallas, tx, 12345 
1, M, 2000-01-01, NULL, NULL, NULL 

내가 원하는 것은 하나의 기록은 다음과 같습니다

SELECT DISTINCT id, gender, dateofbirth, city, state, zip 
FROM t 

이 나에게 다음과 같은 결과 집합을 제공 할 수 있습니다 : 나는 하나 개의 기록에 이러한 여러 레코드를 병합하는 방법을 알아 내려고 노력하고있어

1, M, 2000-01-01, dallas, tx, 12345 
1, M, 2000-01-01, houston, tx, 67890 
,369 : 두 번째 행은 상이한 데이터를 가질 때
1, M, 2000-01-01, dallas, tx, 12345 

유사한 시나리오가 발생할

이 경우에는 id 당 하나의 레코드 만 있기 때문에 레코드 중 하나를 선택하고 다른 레코드는 무시하고 싶을 것입니다.

PostgreSQL에서이 작업을 수행 할 수있는 방법이 있습니까? 나는 아무 쓸데없이 합체를 시도하고 이것을 처리 할 수있는 방법이 있는지 궁금해하고 있습니다.

+0

테이블에 기본 키가 없으므로 고유 한 열이 없습니까? – michaJlS

+1

'1, M, 2000-01-01, NULL, NULL, 45678' 및'1, M, 2000-01-01을 사용하여 두 개의 행 (표시된 행 외에)이 더 있으면 어떻게 될까요? , NULL, 'wa', NULL'. 모든 열이 NULL이 아닌 최소한 하나의 행이 항상 있습니까? –

답변

0
Select * from 
(select a.*, row_number() over (partition by id order by city desc)rn 
From tablename a 
) b where rn=1 

위 쿼리는 항상 id에 대해 하나의 레코드를 반환합니다. 도시에 대해 값이 여러 개인 경우 하나는 null이고 다른 하나는 null 인 경우 쿼리는 city 값을 갖는 레코드를 가져옵니다.

+0

나는 그것을 좋아한다. - 그 파티션 논리는 항상 루프 (아무 말장련은 의도하지 않음)를 위해 나를 던져 줬지만, 나는 예상대로 이것을 작동시킨다. 도움을 많이 주셔서 감사합니다. – BDad

1

아래의 쿼리는 적어도 샘플 데이터에서 작동하는 것으로 보입니다. 데모를 위해 아래 바이올린을보십시오. 필들 (Fiddle)은 다른 데이터베이스 유형을 사용하기 때문에 MySQL을 사용했습니다.

SELECT t1.* 
FROM yourTable t1 
INNER JOIN 
(
    SELECT id, MAX(city || ', ' || state || ', ' || zip) AS location 
    FROM yourTable 
    GROUP BY id 
) t2 
    ON t1.id = t2.id AND 
     t1.city || ', ' || t1.state || ', ' || t1.zip = t2.location 

SQLFiddle

내가 사용하는 트릭은 도시, 국가를 연결하여, 단일 문자열로 압축 한 후 id 값 그룹의 최대 값을 선택하는 것입니다. 이것은 어떻게 든 두 개의 다른 주소에서 동일한 문자열을 형성 할 수 없다고 가정하고 작동합니다. 나는 이것이 귀하의 미국 주소 형식에 적용될 것이라고 생각합니다.

+0

이러한 접근 방식의 유일한 문제점은 다른 행의 데이터를 혼합 할 수 있다는 것입니다. – michaJlS

+0

@michaJlS 방금 도착했습니다. 너무 빨리 게시했습니다. Gordon Linoff가 도착하기 전에 내가 고칠 수 있는지 알아 보자. –

+0

기억한다면, MySQL에서는 필드에 집합 함수를 적용 할 수 없습니다 (http://stackoverflow.com/questions/2197693/any-reason-for-group-by-clause-without-aggregation-function). ,하지만 psql에서 같은 방식으로 작동하는지, 아니면 실제로 반환하는지에 대해서는 알지 못합니다. – michaJlS

관련 문제