有一个表A,请写出一条SQL语句找出所有根据user_code重复,且open_time与close_time存在时间重叠或者包含的数据,如果close_time为空则默认为关闭时间无穷大。
提示: 表中的数据,第1行与100、200行虽然user_code重复,但时间不重叠,不应该被查出来;100行与200行user_code重复,且open_time与close_time存在重叠;3行与101行的存在重叠应该被查出来;2行与201行时间存在重叠应该查出来。
Id user_code … open_time close_time
1 A 2019-01-01 2019-12-31
2 B 2019-02-01
3 C 2019-02-03 2019-12-31
…
100 A 2020-01-01
101 C 2018-01-01 2020-12-31
…
200 A 2020-06-01
201 B 2019-06-01 2020-12-31
…
代码如下:
select *
from
(
select a.id,
a.user_code,
a.open_time,
substring(a.open_time,5,4) as open_time_temp,
a.close_time
from A a
group by a.user_code
) b
where exists(
select *
from
(
select a.id,
a.user_code,
a.open_time,
substring(a.open_time,5,4) as open_time_temp,
a.close_time
from A a
group by a.user_code
) c
where b.id=c.id
and b.open_time_temp=c.open_time_temp
);