2014-09-19 86 views
1

寻找Select语句以基于PARENTGROUPID号码在一组文档中查找记录,其中来自该子项的日期值与该组不一致。如果有帮助,父组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 

我试图抓住不一致的日期为组ID 00001一个例子,其中的日期是2014年5月2日为孩子之一,但父母是2014年5月1日。应该从支票上出来的另一组也是groupID 00006,其中最后一个孩子的日期是1/25/2014而不是1/23/2014

+0

这是非常基本的SQL;你试过什么了? – 2014-09-19 18:24:31

+0

这是非常糟糕的设计。除非您有充分的理由不要,否则您需要规范化数据库。 – 2014-09-19 18:26:42

+0

@ user3622204 - 虽然我同意接受的答案可以工作,但'按分区'方法应该有一个更快的执行计划。 – sgeddes 2014-09-19 21:07:12

回答

0

如果你只是想要ParentGroupIDDate而且不需要RecordNUM你可以使用EXCEPT操作:

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

这形成了一套全行并从中减去包含分钟(日期)每个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 2014-09-19 18:48:32

+0

BONUS我有以下样本SQL更新查询如下更正所产生的矛盾,但我不知道它会工作 UPDATE D1 SET D1.DATE = D2.Datefix FROM EDDSDBO.Document AS D1 INNER JOIN EDDSDBO。 Document AS D2 ON D1.Recordnum = D2.Recordnum WHERE(D1.Recordnum <> D1.ParentGroupID) 任何想法? – user3622204 2014-09-19 21:31:41

+0

@ user3622204我附加了SQL小提琴以包含一个更正语句,将错误值更正为parentgroupid的min(日期);我在and处添加了一个select语句,并显示了已更改的表格。 http://www.sqlfiddle.com/#!3/d9980/5 – jpw 2014-09-19 22:25:12

1

下面是使用min over得到父母的日期一种方法,然后比较孩子的日期:

with cte as (
    select *, min(dt) over (partition by parentgroupid) mindt 
    from yourtable 
) 
select * 
from cte 
where dt <> mindt