Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

SQL query to build start and end date range for every records via Active Flag

TestAnalystJan 11 2019 — edited Jan 12 2019

I am trying to create start and end date range based on Active flag status for the following dataset. The TYPE status is active when Active Flag = Y and it will be effective until Active status change to N.  The TYPE status is InActive  when Active Flag = N and it will be effective until Active status change to Y. Based on this logic, I want to derived End_Date for every rows. It maintains same End date if subsequent row has same active flag and change when Active flag switched. The end result should look like derived Expected Results table as below

drop table PolicyBenefit;

create table PolicyBenefit(PN int,

Type varchar(1),

EffectiveDate date,

Active varchar(1)

);

delete from PolicyBenefit

insert into PolicyBenefit values (1,'D', TO_DATE('2017-03-15', 'yyyy/mm/dd'), 'N');

insert into PolicyBenefit values (1,'D', TO_DATE('2017/03/22', 'yyyy/mm/dd'), 'Y');

insert into PolicyBenefit values (1,'D', TO_DATE('2017/07/02', 'yyyy/mm/dd'), 'Y');

insert into PolicyBenefit values (1,'D', TO_DATE('2017/12/15', 'yyyy/mm/dd'), 'N');

insert into PolicyBenefit values (1,'D', TO_DATE('2018/02/03', 'yyyy/mm/dd'), 'Y');

insert into PolicyBenefit values (1,'D', TO_DATE('2018/05/06', 'yyyy/mm/dd'), 'N');

insert into PolicyBenefit values (1,'D', TO_DATE('2018/05/12' , 'yyyy/mm/dd'), 'N');

insert into PolicyBenefit values (1,'D', TO_DATE('2018/06/15', 'yyyy/mm/dd'), 'Y');

insert into PolicyBenefit values (1,'I', TO_DATE('2017/03/15', 'yyyy/mm/dd'), "N');

insert into PolicyBenefit values (1,'I', TO_DATE('2017/03/22' , 'yyyy/mm/dd'), 'N');

insert into PolicyBenefit values (1,'I', TO_DATE('2017/07/02', 'yyyy/mm/dd'), 'N');

Expected Results

PnTypeStartDateEndDateActive
1D2017/03/152017/03/22N
1D2017/03/222017/12/15Y
1D2017/07/022017/12/15Y
1D2017/12/152018/02/03N
1D2018/02/032018/05/06Y
1D2018/05/062018/06/15N
1D2018/05/122018/06/15N
1D2018/06/159999/12/31Y
1I2017/03/159999/12/31N
1I2017/03/229999/12/31N
1I2017/07/029999/12/31N

I tried find End Date for group using LAST_VALUE "BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW" partition by type, effective date on Active flag, but didn't result correct date. 

,LAST_VALUE(EffectiveDate) over (PARTITION BY pn, Type order by  Active

                between unbounded preceding and unbounded following) AS EndDate

Unfortunately, I do not have Oracle 12.1 installed to use MATCH_RECOGNIZE

This post has been answered by mathguy on Jan 11 2019
Jump to Answer
Comments
Post Details
Added on Jan 11 2019
4 comments
1,249 views