首页 > 解决方案 > 根据日期范围查找至少 2 个连续项目

问题描述

有很多类似问题的解决方案,但仅基于一个日期列。

我想知道可能更好的解决方案来解决这个问题,我附上了我的解决方案,但如果你知道更好的方法,我觉得它有点复杂,请发布它。

这是包含 2 个项目的开始和结束日期的订单表。我想根据日期和项目打印至少 2 个连续的行。

   ITEM , START , END
1. A, 01.01.2020, 31.01.2020
2. A,   01.02.2020, 31.03.2020
3. B,   01.02.2020, 30.04.2020
4. A,   01.05.2020, 30.06.2020
5. B,   01.06.2020, 31.07.2020
6. B,   01.09.2020, 30.09.2020
7. A,   01.08.2020, 31.10.2020
8. B,   01.10.2020, 31.10.2020
9. B,   01.11.2020, 31.12.2020

项目 A 的输出应该是第 1 行和第 2 行,项目 B 的输出应该是第 6,8 和 9 行


这是我的方法

with pool as (
                    select ITEM, START_DATE, END_DATE,
                              nvl(lag(end_date,1) over (partition by item order by end_date),START_DATE-1) prev_End_Date                    
                    from orders  )
, pool2 as     (
                    select item ,
                              START_DATE, END_DATE,
                              sum(case when PREV_END_DATE+1 = START_DATE then 0 else 1 end ) over (partition by item order by START_DATE) grp
                              from pool )
select item,start_date,end_date from (
select 
          ITEM, 
          START_DATE,
          END_DATE,
          grp,
          count(grp) over (partition by item,grp ) cnt
 from pool2)
 where cnt>=2
 ;

标签: sqloraclegaps-and-islands

解决方案


嗯。. . 使用lag()andlead()查看下一个/上一个值并检查它们是否匹配:

select o.*
from (select o.*,
             lag(end) over (partition by product order by start) as prev_end,
             lead(start) over (partition by product order by start) as next_start
      from orders o
     ) o
where start = prev_end + interval '1' day or
      end = next_start - interval '1' day;

推荐阅读