【问题标题】:Select first row in overlapping records选择重叠记录中的第一行
【发布时间】:2018-06-21 11:01:08
【问题描述】:

考虑下表:

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,所以递归查询不是一个选项。

【问题讨论】:

    标签: sql netezza date-range


    【解决方案1】:

    你可以使用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
                     );
    

    【讨论】:

    • 很接近,但这给了我 1、2、6、7 的 ID,即 6 而不是 5。
    • 但是“5”和“4”相交,所以不符合你的条件。
    • 对不起,如果我的描述不准确。由于“4”与“2”相交,“4”为“不合格”。我想目标是选择所有不与任何先前记录相交的记录,这些记录不与任何先前记录相交(等等)。我不确定SQL中是否可以实现这样的顺序逻辑?
    猜你喜欢
    • 2018-09-03
    • 1970-01-01
    • 2022-01-13
    • 2022-01-21
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多