2016-06-10 2 views
-1

특정 필드를 기반으로 중복으로 간주되는 행을 포함하는 데이터 세트가 있습니다. 중복 행을 일치시키고, 일치하지 않는 필드를 평가하고, 삭제를 위해 그 중 하나를 플래그 지정해야합니다. 샘플 테이블은 다음과 같습니다일치하는 행의 기준에 따라 삭제/업데이트 행 식별

ID Col1 Col2 Col3 
1 A  B  CC 
2 A  B  DD 
3 E  F  GG 
4 E  F  HH 

은 그래서 궁극적으로 삭제 행 1 또는 2 중 하나를 신고의 열 3 필드를 행 COL1과 Col2의 일치에 따른 중복으로 1 & 2를 식별하고 비교해야합니다. 행 3에 대해서도 동일합니다. & 4.이 테이블은 Col1과 Col2에서 적어도 하나의 다른 행과 일치하는 행으로 구성됩니다.

내 첫번째 생각은이 형식으로 행을 평평하게 자체에 가입했다 :

t1.ID t2.ID t1.Col1 t1.Col2 TableOneCol3 TableTwoCol3 
1  2  A  B  CC    DD 
3  4  E  F  GG    HH 

는 그 다음 각 행에 대해 TableOneCol3 및 TableTwoCol3을 평가하는 간단한 것입니다. 내가 자기와 함께이 작업을 수행하려고 가입 :
select t1.ID, t2.ID, t1.Col1, t1.Col2, t1.Col3 as TableOneCol3, t2.col3 as TableTwoCol3 
    into #temptable 
from tableOne t1 
    join tableTwo t2 
where t1.Col1 = t2.Col2 
and t1.Col2 = t2.Col2 
and t1.ID <> t2.ID 

그러나 이것은 중복을 제거하지 않습니다 물론

은 - 단지 각 행에 중복 된 필드 정보를 추가합니다.

필자는 데이터를 피벗 팅하는 경로를 따라 갔지만 유사한 결과를 얻었습니다. 중복 된 것도 피벗합니다.
나는 SO를 통해 파고 들지만, 내가해야 할 일에 대한 구체적인 단어가 있는지 확실하지 않습니다. (분명히 모호한 제목은 공짜 일 수 있습니다. 사과하십시오.) 데이터를 단일 열과 피벗으로 병합하는 많은 예제가 있지만 쌍을 이루는 행을 병합하고 결과 집합에서 해당 행 중 하나를 제거하는 것은 없습니다.

잘못된 길로 잘못 가고 있는지 확실하지 않습니다. 이전에 평가 된 것의 맥락에서 각 행을 평가할 필요가있는 것 같습니다. 그러나 커서를 사용하지 않고이 작업을 수행하는 방법을 잘 모르겠습니다.

+0

어떻게 "결국 1 또는 2 행의 deletio에 대해 플래그를 지정 하시겠습니까?"- 조건없이 프로그래밍 방식으로는 수행 할 수 없게됩니다. – dbmitch

+0

삭제 된 행을 평가하는 비즈니스 로직이 있는데, 이는 해당 질문과 관련이 없습니다. 이것은 내가 작업하고있는 데이터의 매우 단순한 예입니다. – pbrown

답변

0

당신은 당신이 LEAD() 분석 함수를 사용하여 설명하는 것과 유사한 형태로 테이블을 얻을 수 있습니다. 이것은 당신의 속은 2보다 큰 그룹으로 올 때 합리적으로 잘 작동하는 이점을 가질 것입니다. 예를 들어 :

select 
    ID, 
    lead(ID) over (partition by col1, col2 order by col3) as nextId, 
    Col1, 
    Col2, 
    Col3, 
    lead(Col3) over (partition by col1, col2 order by col3) as nextCol3 
into #temptable 
from tableOne 

결과의 형식이 될 것입니다

당신은 당신은 당신이 원하고 정확한 표를 얻을 수있는 두 가지보다 더 큰 그룹을 처리 할 필요가 없다는 확신이 있다면
ID nextId Col1 Col2 Col3 nextCol3 
1  2  A  B CC  DD 
2 NULL  A  B DD  NULL 
3  4  E  F GG  HH 
4 NULL  E  F HH  NULL 

나중에 nextId IS NULL을 갖는 행을 걸러 낸다.

+0

Lead - awesome! 예,이 경우 테이블을 정확하게 두 개의 복제본으로 제한 할 수 있습니다. 즉, 널을 제거한 다음 나머지를 평가하여 마스터 데이터 세트에서 행을 제거하십시오. 감사! – pbrown

1

당신이 무엇을하려고하는지 명확히 알지 못합니다. 나는 당신이하려는 것을 바로 일 수있는 몇 가지 빠른 아이디어를 던졌습니다.

if OBJECT_ID('tempdb..#Something') is not null 
    drop table #Something 

create table #Something 
(
    ID int 
    , Col1 char(1) 
    , Col2 char(1) 
    , Col3 char(2) 
) 

insert #Something 
(
    ID 
    , Col1 
    , Col2 
    , Col3 
) 
VALUES 
(1, 'A', 'B', 'CC'), 
(2, 'A', 'B', 'DD'), 
(3, 'E', 'F', 'GG'), 
(4, 'E', 'F', 'HH'); 

with SortedResults as 
(
    select * 
     , ROW_NUMBER() over(partition by Col1, Col2 order by Col3) as RowNum 
    from #Something 
) 

delete SortedResults 
where RowNum > 1 

select * 
from #Something; 

--OR maybe you want to cross tab the data??? 

drop table #Something 

GO 

create table #Something 
(
    ID int 
    , Col1 char(1) 
    , Col2 char(1) 
    , Col3 char(2) 
) 

insert #Something 
(
    ID 
    , Col1 
    , Col2 
    , Col3 
) 
VALUES 
(1, 'A', 'B', 'CC'), 
(2, 'A', 'B', 'DD'), 
(3, 'E', 'F', 'GG'), 
(4, 'E', 'F', 'HH'); 

with SortedResults as 
(
    select * 
     , ROW_NUMBER() over(partition by Col1, Col2 order by Col3) as RowNum 
    from #Something 
) 

select 
    MAX(case when RowNum = 1 then ID end) as ID_1 
    , MAX(case when RowNum = 2 then ID end) as ID_2 
    , Col1 
    , Col2 
    , MAX(case when RowNum = 1 then Col3 end) as Col3_1 
    , MAX(case when RowNum = 2 then Col3 end) as Col3_2 
from SortedResults 
group by 
    Col1 
    , Col2 
+0

옵션 1에 대한 내기가 있습니다. http://rextester.com/FWCU91123 –

관련 문제