如何在一组行中找到连续的日期?

时间:2015-01-08 16:48:37

标签: sql oracle

我有一个包含日期范围的表,其中一些是连续的:

COUNTRY START_DATE END_DATE   CODE
------- ---------- ---------- ----
FR      01/05/2014 05/06/2014 07   
FR      05/06/2014 30/06/2014 07   
US      12/05/2010 31/12/2014 08   
FR      30/06/2014 12/01/2015 07   

如何在数据中找到连续的范围?对于国家&地区的FR'和代码' 07'第二行的开始日期,05/06/2014,与第一行的结束日期相同;并且第三行的开始日期与第二行的结束日期相同,因此这三行是连续的,我希望这三个记录的整个开始和结束日期:

COUNTRY START_DATE END_DATE   CODE
------- ---------- ---------- ----
FR      01/05/2014 12/01/2015 07

1 个答案:

答案 0 :(得分:0)

您可以使用窗口功能来完成此操作。此代码改编自another answer,应该适合您。目前还不清楚数据是应该按国家/地区划分还是按代码划分(从示例数据中无法分辨),但是如果需要按国家/地区和代码对数据进行分区,请将谓词更改为partition by country, code order by start_date代替。

select 
  country, 
  code, 
  min(start_date) start_date, 
  max(end_date)   end_date
from ( 
  select 
    country,
    code, 
    start_date, 
    end_date, 
    max(rn) over (partition by country order by start_date) maxrn
  from ( 
    select 
      country, 
      code, 
      start_date, 
      end_date, 
      case lag(end_date) over (partition by country order by start_date)
        when start_date then null
        else rownum
      end rn
    from table1
  ) 
) 
group by country, maxrn, code
order by country, start_date

Sample SQL Fiddle