2014-09-19 2 views
1

PARENTGROUPID 숫자를 기반으로 문서 그룹 내에서 레코드를 찾는 select 문을 찾고 있습니다. 여기서 자식의 날짜 값은 해당 그룹과 일치하지 않습니다. 상위 그룹 ID는 그룹에서 가장 낮은 레코드 번호입니다 (도움이되는 경우).날짜 값을 기준으로 패밀리 충돌을 찾는 SQL 쿼리

예를 들면. 나는 다음과 같은 기록이

RecordNUM ParentGroupID Date 
000001  000001   5/1/2014 
000002  000001   5/1/2014 
000003  000001   5/2/2014 
000004  000004   11/2/2013 
000005  000004   11/2/2013 
000006  000006   1/23/2014 
000007  000006   1/23/2014 
000008  000006   1/23/2014 
000009  000006   1/25/2014 

나는 날짜가 아이 중 하나 2014년 5월 2일하지만 부모가 2014년 5월 1일입니다 그룹 ID 00001에 대한 예로서 일관성이 날짜를 잡으려고 노력하고 있습니다. 수표에서 올 수있는 다른 그룹도 groupID 00006입니다. 마지막 아이는 2014 년 1 월 23 일 대신 1/20/2014 12 월 12 일

+0

꽤 기본적인 SQL입니다. 지금까지 뭐 해봤 어? –

+0

이것은 정말 나쁜 디자인입니다. 당신은 좋은 이유가 없다면 데이터베이스를 정규화해야합니다. –

+0

@ user3622204 - 허용 된 대답이 효과가 있다는 것에 동의하지만, '파티션 바이 바이'접근법은 훨씬 빠른 실행 계획을 가져야합니다. – sgeddes

답변

0

ParentGroupIDDate을 원하고 RecordNUM 당신이 EXCEPT 연산자를 사용할 수 있습니다 :이 모든 행의 집합을 형성하고 그것에서 각 ParentGroupID의 분 (날짜)가 포함 된 세트를 뺀

select parentgroupid, date from your_table 
except 
select parentgroupid, min(date) 
from your_table 
group by parentgroupid 

합니다. 당신도 당신이 하위 쿼리로 위의 쿼리를 사용할 수있는 RecordNUM 열을해야하는 경우

조인 :

select * from your_table t1 
inner join (
    select parentgroupid, date from your_table 
    except 
    select parentgroupid, min(date) 
    from your_table 
    group by parentgroupid 
) t2 on t1.ParentGroupID = t2.ParentGroupID and t1.Date = t2.Date 

Sample SQL Fiddle

+0

감사합니다 jpw -이 효과가 있습니다! – user3622204

+0

보너스가 나는 결과 불일치를 해결하려면 아래의 다음 샘플 SQL 업데이트 쿼리를 가지고 있지만 나는 그것이 D1 INNER 가입 EDDSDBO AS EDDSDBO.Document로부터 UPDATE D1 SET의 D1.DATE = D2.Datefix 작동합니다 확실하지 않다. 문서 AS D2 ON D1.Recordnum = D2.Recordnum 어디에서 (D1.Recordnum <> D1.ParentGroupID) 아이디어가 있습니까? – user3622204

+0

@ user3622204 나는 parentgroupid의 min (date)에 잘못된 값을 수정하는 update 문을 포함하기 위해 SQL Fiddle을 추가했다. 에 select 문을 추가하고 변경된 표를 보여줍니다. http://www.sqlfiddle.com/#!3/d9980/5 – jpw

1

가 여기에 부모의 날짜를 얻을 수 min over를 사용하여 하나의 접근 방식, 그 비교

with cte as (
    select *, min(dt) over (partition by parentgroupid) mindt 
    from yourtable 
) 
select * 
from cte 
where dt <> mindt 
  • 012 : 아이의 현재까지