0

我正在努力使用适当的查询来查找重复项,同时尊重记录的有效开始日期和结束日期。下面的示例数据。

ClientName ClientID EffectiveStart EffectiveEnd
1 1900-01-01 2100-01-01
1 1900-01-01 2100-01-01
B 2 1900-01-01 2012-05-01
C 2 2012-05-01 2100-01-01
D 3 1900-01-01 2012-05-01
E 3 2012-04-30 2100-01-01
F 4 2012-04-15 2100-01-01

我正在寻找的输出如下。

客户名称客户ID
1
3
3

逻辑是客户端 A 的 ID 1 重复。客户 B 和 C 有重复 (2) 但日期范围使得两个重复不相互重叠,这意味着它们不应被视为重复。客户 D 和 E 的 ID 3 重复并且日期范围重叠,因此应将其视为重复。客户端 F 没有重复项,因此不应显示在输出中。

有什么想法吗?问题?

4

2 回答 2

1

有两个版本。Exists 更简单,但可能比 join 慢。如果每个相同的 clientid 有重叠的记录,则对每条记录进行检查;它必须至少找到一个,它本身,因此分组和拥有。

select distinct ClientName, ClientID
  from Table1
 where exists
 (
   select null
     from table1 test1
    where test1.clientid = table1.clientid
      and test1.EffectiveStart < table1.EffectiveEnd
      and test1.EffectiveEnd > table1.EffectiveStart
    group by test1.ClientID
   having count (*) > 1
 )

Join 的作用相同,但由于对所有记录进行分组,因此必须将它们全部计数。

select test1.clientid
from table1 test1 
join table1 test2 on test1.clientid = test2.clientid
where test1.EffectiveStart < test2.EffectiveEnd 
  and test1.EffectiveEnd > test2.EffectiveStart
group by test1.clientid
having count (*) > (select count (*) 
                      from table1 
                     where clientid = test1.clientid)

我省略了客户端名称的检索,因为人们讨厌看到嵌套查询。

现场测试在Sql Fiddle

于 2012-05-07T20:50:04.397 回答
0

需要PK

select c1.name, c2.name, c1.id
from client c1 
join client c2 on c1.id = c2.id and c1.PK < c2.PK
where c1.Start > c2.End or c1.End < c2.Start

确定两个日期范围是否重叠 请给他+1

于 2012-05-07T19:55:46.213 回答