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!

Determine Date Range in SQL Query

Saxxx_2001Oct 3 2017 — edited Oct 3 2017

Hi,

I need some help i am trying to get the date range from a table

My Source Data is a below

pastedImage_0.png

I am able to get result like below, but in sixth row the ACT_HIRE_DT date is coming '15-MAR-1994' but what i am expecting it should show "15-JAN-2005", 2nd result should start a new Range.

pastedImage_3.png

Create Table Script:

create table test_date

(

PER_ID NUMBER(11),

REC_TYPE VARCHAR2(11),

EVT_DT DATE,

HIRE_DT DATE,

TERM_DT DATE,

TRNS_DT DATE,

PROM_DT DATE,

EFF_START_DT DATE,

EFF_END_DT DATE

);

Insert Script:

Insert into TEST_DATE (PER_ID,REC_TYPE,EVT_DT,HIRE_DT,TERM_DT,TRNS_DT,PROM_DT,EFF_START_DT,EFF_END_DT) values (13331,'HIRE',to_date('15-MAR-1994','DD-MON-YYYY'),to_date('15-MAR-1994','DD-MON-YYYY'),null,null,null,to_date('15-MAR-1994','DD-MON-YYYY'),to_date('16-SEP-1996','DD-MON-YYYY'));

Insert into TEST_DATE (PER_ID,REC_TYPE,EVT_DT,HIRE_DT,TERM_DT,TRNS_DT,PROM_DT,EFF_START_DT,EFF_END_DT) values (13331,'TRANSFER',to_date('26-FEB-1998','DD-MON-YYYY'),null,null,to_date('26-FEB-1998','DD-MON-YYYY'),null,to_date('26-FEB-1998','DD-MON-YYYY'),to_date('28-FEB-1998','DD-MON-YYYY'));

Insert into TEST_DATE (PER_ID,REC_TYPE,EVT_DT,HIRE_DT,TERM_DT,TRNS_DT,PROM_DT,EFF_START_DT,EFF_END_DT) values (13331,'TRANSFER',to_date('10-JUL-2000','DD-MON-YYYY'),null,null,to_date('10-JUL-2000','DD-MON-YYYY'),null,to_date('01-OCT-1998','DD-MON-YYYY'),to_date('29-JUL-2002','DD-MON-YYYY'));

Insert into TEST_DATE (PER_ID,REC_TYPE,EVT_DT,HIRE_DT,TERM_DT,TRNS_DT,PROM_DT,EFF_START_DT,EFF_END_DT) values (13331,'TERMINATION',to_date('30-JUL-2002','DD-MON-YYYY'),null,to_date('30-JUL-2002','DD-MON-YYYY'),null,null,to_date('15-MAR-1994','DD-MON-YYYY'),to_date('14-JAN-2005','DD-MON-YYYY'));

Insert into TEST_DATE (PER_ID,REC_TYPE,EVT_DT,HIRE_DT,TERM_DT,TRNS_DT,PROM_DT,EFF_START_DT,EFF_END_DT) values (13331,'HIRE',to_date('15-JAN-2005','DD-MON-YYYY'),to_date('15-JAN-2005','DD-MON-YYYY'),null,null,null,to_date('15-JAN-2005','DD-MON-YYYY'),to_date('09-JUL-2006','DD-MON-YYYY'));

Insert into TEST_DATE (PER_ID,REC_TYPE,EVT_DT,HIRE_DT,TERM_DT,TRNS_DT,PROM_DT,EFF_START_DT,EFF_END_DT) values (13331,'TRANSFER',to_date('10-JUL-2006','DD-MON-YYYY'),null,null,to_date('10-JUL-2006','DD-MON-YYYY'),null,to_date('10-JUL-2006','DD-MON-YYYY'),to_date('31-DEC-4712','DD-MON-YYYY'));

Note: I am using Oracle 12c.

Query I am currently using:

SELECT test_date.*,

MAX(evt_dt) OVER (PARTITION BY per_id,eff_start_dt,eff_end_dt ORDER BY evt_dt DESC) AS MX_EVT_DT,

CASE WHEN hire_dt IS NULL THEN MIN(hire_dt) OVER (PARTITION BY per_id ORDER BY hire_dt ASC) ELSE hire_dt END AS ACT_HIRE_DT

FROM test_date

where per_id = 13331

order by evt_dt asc;

Thanks

This post has been answered by Solomon Yakobson on Oct 3 2017
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Oct 31 2017
Added on Oct 3 2017
8 comments
163 views