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是一些任意结束的日期,我们的系统给那些目前活跃且没有结束日期的成员。
答
下获得连续成员的每一个周期的一行:
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
活跃,如果你想为当前成员的数据。
什么是您的Oracle版本?从12.1开始,你可以看看[match_recognize](https://docs.oracle.com/database/121/DWHSG/pattern.htm)。 –