我有一个数据库如下:
ID | Term | Start Date | End Date
12 6 Jul '12 Dec '12
12 6 Jan '13 Jun '13
13 2 Jul '12 Aug '12
13 12 Jul '12 Jul '13
所以每个ID都是已经完成的交易。这是我正在处理的数据库,看起来有些数据输入不正确。我正在尝试编写一个过滤器,其中显示了相同交易ID的重叠术语。因此,例如,对于ID 12,合同从12月7日到12月合同为期6个月,然后又延长了6个月。对于ID 13,有人输入数据不正确,合同在同一个词中“两次”,日期重叠。
所以我需要的是一个过滤器,它对每个ID集合进行排序(不一定只有两个,合同可以扩展任意次数)并检查该ID中所有日期的有效性,如定义如上。我不是SQL原生的,所以while()循环是我想到的第一件事,但我想知道是否有更简单的方法来应用这种过滤器?
答案 0 :(得分:1)
您需要找到日期范围重叠的所有行吗?
是否存在主键/此表的任何唯一标识符,以避免将行与自身进行比较?
select * from vt as t1
where exists
( select * from vt as t2
where t1.id = t2.id -- same ID
and t1.PK <> t2.PK -- but not the same row
and t1.end_date >= t2.start_date -- date ranges
and t1.start_date <= t2.end_date -- overlap
)
根据您的数据,您可能需要将比较更改为&lt; / &gt; ,而不是&lt; = / &GT; = 强>