SQL:从日期列表创建Orignial生效日期范围

问题描述:

,我有以下数据SQL:从日期列表创建Orignial生效日期范围

Mbr_ID|Grp_id|Srt_date|End_date 
0001 |A  |1/1/2015|6/1/2015 
0001 |B  |6/1/2015|1/1/2017 
0001 |C  |1/1/2017|11/17/1858 
0002 |A  |1/1/2015|6/1/2015 
0002 |B  |1/1/2016|1/1/2017 
0002 |C  |1/1/2017|11/17/1858 
0003 |A  |1/1/2017|2/1/2017 
0003 |B  |2/1/2016|11/17/1858 

从中我想提取当前组的成员是在和一个成员的原来的开始日期,其中在覆盖面上没有失误。结果如下。

Mbr_ID|Grp_id|Srt_date|End_date 
0001 |C  |1/1/2015|11/17/1858 
0002 |C  |1/1/2016|11/17/1858 
0003 |B  |1/1/2017|11/17/1858 

会员技术我希望的2016年1月1日,他们曾在承保中断,从2015年6月1日至2016年1月1日开始日期。需要注意的是,18/18/1858是一些任意结束的日期,我们的系统给那些目前活跃且没有结束日期的成员。

+0

什么是您的Oracle版本?从12.1开始,你可以看看[match_recognize](https://docs.oracle.com/database/121/DWHSG/pattern.htm)。 –

下获得连续成员的每一个周期的一行:

select mbr_id, 
     max(grp_id) keep (dense_rank first order by srt_date desc) as grp_id, 
     min(srt_date) as srt_date, 
     (case when min(end_date) = date '1858-11-17' then min(end_date) 
      else max(end_date) 
     end) as end_date 
from (select t.*, 
      sum(case when prev_end_date = srt_date then 0 else 1 end) over (partition by mbr_id order by srt_date) as grp 
     from (select t.*, 
        lag(end_date) over (partition by mbr_id order by srt_date) as prev_end_date 
      from t 
      ) t 
    ) t 
group by mbr_id, grp; 

可以过滤为end_date活跃,如果你想为当前成员的数据。

+0

谢谢!让我真正接近我需要的东西。如果我想为集团ID设置一个标准,只将某些组中的成员包括在内,我会在哪里放置“Where”功能?我希望它在你选择语句的组ID(grp_id字段)上。 – dnp2

+0

**快速编辑。我实际上可能会加入到具有我需要的特定组ID的表中。只是努力获得内部连接/功能仍然得到我想 – dnp2

+0

@ dnp2的结果。 。 。你会把它放在最里面的子查询中。 –