2017-06-29 93 views
1

我有一個表,我有4列 串行(nvarchar的)查找重複的記錄,SID(NVARCHAR),dateCreated會(日期),CID(獨特和INT) 我想找到記錄存在重複的地方系列SID和其中2個副本系列落在日期範圍180天之間。在特定日期範圍內

請幫助

樣本數據

Serial   SID  DateCreated    CID 
02302-25-0036 HONMD01 2017-05-01 00:00:00.000 1 
02302-25-0036 HONMD01 2017-05-01 00:00:00.000 3 
0264607   HONMD01 2017-05-01 00:00:00.000 65 
0264607   HONMD01 2016-05-01 00:00:00.000 45 
03118-09-0366 PRIVA00 2016-05-20 00:00:00.000 34 
03118-09-0366 PRIVA00 2016-05-20 00:00:00.000 87 
0969130   140439 2017-05-09 00:00:00.000 32 
0969130   140439 2017-05-09 00:00:00.000 23 
1049567   INIIL00 2017-04-12 00:00:00.000 76 
+1

請向我們提供 –

+0

你想,如果目前的瞭解一些樣本數據和預期輸出線是在過去的180天? –

+0

添加了示例數據。 例如,對於序列號02302-25-0036,有兩個具有相同SID的條目,兩者都在180天內我們需要該數據。如果兩個日期相距超過180,我們不希望這樣 – aman6496

回答

0
create table #Test (Serial nvarchar(20), [SID] nvarchar(10), DateCreated datetime, CID int) 

Insert into #Test values ('02302-25-0036', 'HONMD01', '2017-05-01 00:00:00.000', 1) 
        , ('02302-25-0036', 'HONMD01', '2017-05-01 00:00:00.000', 3) 
        , ('0264607', 'HONMD01', '2017-05-01 00:00:00.000', 65) 
        , ('0264607', 'HONMD01', '2016-05-01 00:00:00.000', 45) 
        , ('03118-09-0366', 'PRIVA00', '2016-05-20 00:00:00.000', 34) 
        , ('03118-09-0366', 'PRIVA00', '2016-05-20 00:00:00.000', 87) 
        , ('0969130', '140439', '2017-05-09 00:00:00.000', 32) 
        , ('0969130', '140439', '2017-05-09 00:00:00.000', 23) 
        , ('1049567', 'INIIL00', '2017-04-12 00:00:00.000', 76) 

select distinct a.* 
from 
(
select t.* 
from #Test t 
inner join (
    Select Serial, [SID] 
    from #Test 
    group by Serial, [SID] 
    Having count(*)>=2 
    ) d on d.Serial = t.Serial and t.SID= t.SID 
) a 
full outer join 
(
select t.* 
from #Test t 
inner join (
    Select Serial, [SID] 
    from #Test 
    group by Serial, [SID] 
    Having count(*)>=2 
    ) d on d.Serial = t.Serial and t.SID= t.SID 
) b on a.Serial = b.Serial and a.SID= b.SID 
where datediff(d,a.DateCreated, b.DateCreated)<180 
+0

謝謝。 Cloudsafe – aman6496

0

嘗試這樣做:

with cte as (
    select 
     serial, 
     sid, 
     dateCreated, 
     cid, 
     coalesce(max(dateCreated) over(partition by serial, sid order by cid, dateCreated asc rows between unbounded preceding and 1 preceding), '1900-01-01') as last, 
     coalesce(min(dateCreated) over(partition by serial, sid order by cid, dateCreated asc rows between 1 following and unbounded following), '5999-01-01') as next 
    from table_name 
) 
select * 
from cte 
where 
    datediff(day, last, dateCreated) >= 180 
    and datediff(day, dateCreated, next) >= 180 
+0

謝謝ЕвгенийКондратенко – aman6496

0

這是一個具有挑戰性的問題!爲了便於理解,我用*(PreviousDate,rno)離開了最終輸出。這是我的方式來解決:

Create table #t(Serial nvarchar(100),SID nvarchar(100),DateCreated date,CID int) 
Insert into #t values 
('02302-25-0036', 'HONMD01', '2017-05-01 00:00:00.000', 1), 
('02302-25-0036', 'HONMD01', '2017-05-01 00:00:00.000', 3), 
('0264607',   'HONMD01', '2017-05-01 00:00:00.000', 65), 
('0264607',   'HONMD01', '2016-05-01 00:00:00.000', 45), 
('03118-09-0366', 'PRIVA00', '2016-05-20 00:00:00.000', 34), 
('03118-09-0366', 'PRIVA00', '2016-05-20 00:00:00.000', 87), 
('0969130',   '140439', '2017-05-09 00:00:00.000', 32), 
('0969130',   '140439', '2017-05-09 00:00:00.000', 23), 
('1049567',   'INIIL00', '2017-04-12 00:00:00.000', 76) 

Select iq2.* 
FROM 
(Select iq.Serial, iq.SID, iq.DateCreated, iq.CID, iq.PreviousDate, 
     ROW_NUMBER() OVER (PARTITION BY iq.Serial,iq.SID, CASE WHEN DATEDIFF(day, iq.DateCreated, iq.PreviousDate) <= 180 THEN 1 ELSE 0 END 
          ORDER BY Serial,SID) rno 
    FROM 
     (select Serial,SID,DateCreated,CID, 
       MAX(DateCreated) OVER (PARTITION BY Serial,SID ORDER BY Serial,SID) maxDate, 
       DATEADD(day,-180,MAX(DateCreated) OVER (PARTITION BY Serial,SID ORDER BY Serial,SID)) PreviousDate 
     from #t 
    )iq 
)iq2 
where iq2.rno <> 1 

輸出:

Serial     SID  DateCreated CID   PreviousDate rno 
----------    -------  ---------- ----   ----------- ---- 
02302-25-0036   HONMD01  2017-05-01 3   2016-11-02  2 
03118-09-0366   PRIVA00  2016-05-20 87   2015-11-22  2 
0969130     140439  2017-05-09 23   2016-11-10  2 

PS:PreviousDate是MAX PreviousDate

+0

謝謝它的工作原理 – aman6496

+0

@ aman6496:將它標記爲答案,如果有幫助的話。 –