选择重叠记录中的第一行

时间:2018-06-21 11:01:09

标签: sql netezza date-range

请考虑下表:

ID  From        To
1   07.06.2015  07.06.2015
2   03.01.2016  19.01.2016
3   05.01.2016  20.01.2016
4   19.01.2016  24.01.2016
5   20.01.2016  24.01.2016
6   24.01.2016  24.01.2016
7   11.03.2016  27.03.2016

我该如何只选择 a)没有重叠记录的行或 b)一系列重叠记录的第一行?

对于上面的示例,我想保留记录1和7(它们没有重叠)以及2和5(3和4重叠2,而6个重叠5):

ID  From        To
1   07.06.2015  07.06.2015
2   03.01.2016  19.01.2016
5   20.01.2016  24.01.2016
7   11.03.2016  27.03.2016

PS:我在Netezza上,所以不能进行递归查询。

1 个答案:

答案 0 :(得分:0)

您可以使用not exists

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.from < t.from and t2.to > t.from
                 );

注意:这假设from日期是不同的。如果可以重复,则:

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.from <= t.from and
                        t2.id < t.id and
                        t2.to > t.from
                 );