比较 sql 服务器中相同 table 和 return 副本的每条记录
Compare each records of same table in sql server and return duplicates
我 table 喜欢 below.I 想要得到重复的 records.Here 如果 date2 和 date4 具有相同的日期或日期在彼此之间小于或等于 10 天的条件那么记录是重复的。我在 DB.Showing 中有大约 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
问题是我无法找到一种方法,其中每一行都可以与上述日期相互比较 condition.I 应该得到如下所示的重复结果:
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
请help.Thanks.
您可以使用 join
来搜索其他相同的行。 join
尝试根据 on
条件匹配右侧 table 的所有行。例如:
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.shortname,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
我 table 喜欢 below.I 想要得到重复的 records.Here 如果 date2 和 date4 具有相同的日期或日期在彼此之间小于或等于 10 天的条件那么记录是重复的。我在 DB.Showing 中有大约 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
问题是我无法找到一种方法,其中每一行都可以与上述日期相互比较 condition.I 应该得到如下所示的重复结果:
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
请help.Thanks.
您可以使用 join
来搜索其他相同的行。 join
尝试根据 on
条件匹配右侧 table 的所有行。例如:
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.shortname,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