Sql server 比较sql server中相同表的每条记录并返回重复项

Sql server 比较sql server中相同表的每条记录并返回重复项,sql-server,sql-server-2008,sql-server-2008-r2,Sql Server,Sql Server 2008,Sql Server 2008 R2,我有如下表。我想得到重复的记录。这里的条件是,如果date2和date4具有相同的日期,或者彼此之间的间隔小于或等于10天,那么记录是重复的。我在数据库中有大约2000条记录。这里显示了几个示例。 Date1可以忽略。日期可能相同,也可能不同 ID Number Code Type date1 Date2 date3 Date4 status shortname CP deferred 1 EO2 C TO

我有如下表。我想得到重复的记录。这里的条件是,如果date2和date4具有相同的日期,或者彼此之间的间隔小于或等于10天,那么记录是重复的。我在数据库中有大约2000条记录。这里显示了几个示例。 Date1可以忽略。日期可能相同,也可能不同

ID Number   Code Type   date1     Date2       date3        Date4     status   shortname     CP      deferred
1  EO2      C    TO   9/20/2000  9/1/2010   9/18/2010   9/1/2010     Archi    Ordinary  58.65586    0
2  EO2      C    TO   9/20/2000  9/5/2010   9/18/2010   9/5/2010     Archi    Ordinary  58.65586    0
3  EO2      C    TO   9/21/2000  9/10/2010  9/18/2010   9/10/2010    Archi    Ordinary  58.65586    0
4  EO2      C    TO   9/21/2000  9/24/2010  9/18/2010   9/24/2010    Archi    Ordinary  58.65586    0
我写了以下问题:

select * from T a
join T b on a.ID = b.ID
where a.[Number] = b.[Number] and a.ID >1
还有,我把这个结在一起:

SELECT * FROM T a WHERE a.Id IN (SELECT b.Id FROM T b)
EXCEPT
SELECT * FROM T a
问题是我无法找到一种方法,在上面的日期条件下,每一行都可以相互比较。我应该得到如下结果:

Number  Code Type   date1     Date2       date3        Date4     status   shortname     CP      deferred
EO2     C    TO   9/20/2000  9/1/2010   9/18/2010   9/1/2010     Archi    Ordinary  58.65586    0
EO2     C    TO   9/20/2000  9/5/2010   9/18/2010   9/5/2010     Archi    Ordinary  58.65586    0
EO2     C    TO   9/21/2000  9/10/2010  9/18/2010   9/10/2010    Archi    Ordinary  58.65586    0
请帮助。谢谢。

您可以使用联接搜索其他相同的行。联接尝试根据on条件匹配右侧表中的所有行。例如:

select  *
from    YourTable t1
join    YourTable t2
on      t1.ID < t2.ID -- Must be different rows
                      -- Smaller than presents the duplicates once
                      -- Otherwise you'd get both 1,3 and 3,1
        and abs(datediff(day, t1.date2, t2.date2)) <= 10
        and abs(datediff(day, t1.date4, t2.date4)) <= 10
        and t1.Number = t2.Number
        and t1.Code = t2.Code
        and -- So on for every column that should be equal

要忽略列,请从on条件中忽略它。

这就是我解决此问题的方法。谢谢你的帮助

select t1.Number,t1.Code,t1.Type,t1.date1,t1.Date2,t1.date3,t1.Date4,t1.stats,t1.shortn‌​ame,t1.CP, t1.deferred 
from T t1 join T t2 on 1=1 and t2.Number = t1.Number and t2.Code = t1.Code and t2.Type = t1.Type and t2.deferred = t1.eferred and t2.CP = t1.CP and t2.status = t1.status and abs(datediff(day,t1.Date2,t2.Date2)) <=10 and abs(datediff(day,t1.date3,t2.date3)) <=10 and abs(datediff(day,t1.Date4,t2.Date4)) <=10 group by t1.Number, t1.Code,t1.Type , t1.date1, t1.Date2,t1.date3,t1.Date4 ,t1.status,t1.shortname,t1.CP, t1.deferred having count(*) > 1

示例中的第三行有不同的date1,那么它怎么可能仍然是重复的呢?如果我使用这个条件t1.ID1来计算这个ABS吗?如果我在输出中不获取ID,就可以了。有没有你尝试过的方案的例子?不知道你的意思。在中设置一个示例模式将有助于澄清您的issueLink未打开。我的意思是:选择t1.Number、t1.Code、t1.Type、t1.date1、t1.Date2、t1.date3、t1.Date4、t1.stats、t1.shortname、t1.CP、,t1.deferred=t1.CP和t2.status=t1.status和absdatediffday,t1.Date2,t2.Date2