选择最大差距oracle

时间:2017-08-28 22:37:17

标签: oracle

我有以下成员的数据

EFF_DT-Term_dt
1/1/13-7/31/14
1/1/15-3/31/15
5/1/15-5/31/15
6/1/15-12/31/15
1/1/16-12/31/16

这里有2个差距 - 在2014年7月31日和2015年3月31日之后。我想选择第5/1 / 15-5 / 31/15行,因为它是最大间隙后的最小日期。我尝试使用

select ( FIRST_VALUE(EFF_DT) OVER (PARTITION BY MemberID ORDER BY FLAG DESC) AS CUR_EFF_DT)
from
(
select   EFF_DT,     
CASE WHEN LAG(TERM_DT, 1) OVER (PARTITION BY MemberID ORDER BY TERM_DT) = EFF_DT - 1 THEN 0
           ELSE sequence.nextval
END AS FLAG
from effective_dates_table). 

这是正确的结果,但我不想使用序列是否有其他最简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

以下是一种方法...使用分析LAG()函数计算差异,然后按member_id分组,并使用汇总LAST()函数。

注意:term_dt和以下eff_dt之间可能有多对行具有相同且最大的差距。如果发生这种情况,您必须澄清应该选择哪一行。下面的解决方案选择最早发生的事件(如果发生这种情况)。如果您想要最新的事件,请将MIN更改为MAX。如果你想要别的东西,只需说出要求是什么。

with
     inputs ( member_id, eff_dt, term_dt ) as (
       select 101, to_date('1/1/13', 'mm/dd/yy'), to_date('7/31/14' , 'mm/dd/yy') from dual union all
       select 101, to_date('1/1/15', 'mm/dd/yy'), to_date('3/31/15' , 'mm/dd/yy') from dual union all
       select 101, to_date('5/1/15', 'mm/dd/yy'), to_date('5/31/15' , 'mm/dd/yy') from dual union all
       select 101, to_date('6/1/15', 'mm/dd/yy'), to_date('12/31/15', 'mm/dd/yy') from dual union all
       select 101, to_date('1/1/16', 'mm/dd/yy'), to_date('12/31/16', 'mm/dd/yy') from dual
     )
-- End of simulated inputs (for testing only, not part of the solution).
-- Use your actual table and column names in the SQL query below.
select member_id,
       min(eff_dt)  keep (dense_rank last order by diff nulls first) as eff_dt,
       min(term_dt) keep (dense_rank last order by diff nulls first) as term_dt
from   (
         select member_id, eff_dt, term_dt,
                eff_dt - lag(term_dt) over (partition by member_id order by eff_dt) as diff
         from   inputs
       )
group by member_id
;

MEMBER_ID  EFF_DT               TERM_DT           
---------  -------------------  -------------------
      101  2015-01-01 00:00:00  2015-03-31 00:00:00