2014-09-19 84 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