Используйте row_number (), например:
SELECT *
FROM
(select mytbl.*,
row_number() over (partition by mytbl.id order by <condition order> ) rn
from mytbl) a
WHERE a.rn = 1
пример:
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=f5e43c0f001657f1bd17fb89186df6ef
with mytbl as
(select 1 id,
TO_DATE('01-JAN-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('02-JUL-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'HIRE' action_code,
'ACTIVE' status_type FROM dual
union all
select 1 id,
TO_DATE('03-JUL-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('06-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'ASG_CHANGE' action_code,
'ACTIVE' status_type FROM dual
union all
select 1 id,
TO_DATE('07-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('31-DEC-4712', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'ASG_CHANGE' action_code,
'ACTIVE' status_type FROM dual
union all
select 2 id,
TO_DATE('01-JAN-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('02-JUL-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'HIRE' action_code,
'ACTIVE' status_type FROM dual
union all
select 2 id,
TO_DATE('03-JUN-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('02-JUL-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'TERM' action_code,
'INACTIVE' status_type FROM dual
union all
select 2 id,
TO_DATE('07-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('15-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'ASG_CHANGE' action_code,
'ACTIVE' status_type FROM dual
union all
select 2 id,
TO_DATE('16-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('31-DEC-4712', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'ASG_CHANGE' action_code,
'ACTIVE' status_type FROM dual
union all
select 3 id,
TO_DATE('01-JAN-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('02-JUL-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'HIRE' action_code,
'ACTIVE' status_type FROM dual
union all
select 3 id,
TO_DATE('03-JUN-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('05-JUL-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'GLB_TRANSFER' action_code,
'INACTIVE' status_type FROM dual
union all
select 3 id,
TO_DATE('07-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('15-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'GLB_TRANSFER' action_code,
'ACTIVE' status_type FROM dual
union all
select 3 id,
TO_DATE('16-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('31-DEC-4712', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'ASG_CHANGE' action_code,
'ACTIVE' status_type FROM dual)
SELECT *
FROM
(select mytbl.*,
row_number() over (partition by mytbl.id
order by
case when mytbl.ACTION_CODE = 'GLB_TRANSFER'
and mytbl.start_date = TO_DATE('07-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American')
and status_type = 'ACTIVE' then 0
else 1 end) rn
from mytbl) a
WHERE a.rn = 1
Это верно для 3-го числа. Я думаю, что у вас есть общее состояние
ВЫХОД:
1 01.01.2019 02.07.2019 HIRE ACTIVE 1
2 01.01.2019 02.07.2019 HIRE ACTIVE 1
3 07.08.2019 15.08.2019 GLB_TRANSFER ACTIVE 1
также:
with mytbl as
(select 1 id,
TO_DATE('01-JAN-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('02-JUL-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'HIRE' action_code,
'ACTIVE' status_type FROM dual
union all
select 1 id,
TO_DATE('03-JUL-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('06-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'ASG_CHANGE' action_code,
'ACTIVE' status_type FROM dual
union all
select 1 id,
TO_DATE('07-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('31-DEC-4712', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'ASG_CHANGE' action_code,
'ACTIVE' status_type FROM dual
union all
select 2 id,
TO_DATE('01-JAN-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('02-JUL-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'HIRE' action_code,
'ACTIVE' status_type FROM dual
union all
select 2 id,
TO_DATE('03-JUN-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('02-JUL-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'TERM' action_code,
'INACTIVE' status_type FROM dual
union all
select 2 id,
TO_DATE('07-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('15-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'ASG_CHANGE' action_code,
'ACTIVE' status_type FROM dual
union all
select 2 id,
TO_DATE('16-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('31-DEC-4712', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'ASG_CHANGE' action_code,
'ACTIVE' status_type FROM dual
union all
select 3 id,
TO_DATE('01-JAN-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('02-JUL-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'HIRE' action_code,
'ACTIVE' status_type FROM dual
union all
select 3 id,
TO_DATE('03-JUN-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('05-JUL-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'GLB_TRANSFER' action_code,
'INACTIVE' status_type FROM dual
union all
select 3 id,
TO_DATE('07-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('15-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'GLB_TRANSFER' action_code,
'ACTIVE' status_type FROM dual
union all
select 3 id,
TO_DATE('16-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('31-DEC-4712', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'ASG_CHANGE' action_code,
'ACTIVE' status_type FROM dual
union all
select 3 id,
TO_DATE('16-AUG-2019', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('31-DEC-4712', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'ASG_CHANGE' action_code,
'ACTIVE' status_type FROM dual
union all
select 4 id,
TO_DATE('01-AUG-2018', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('31-DEC-4712', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'HIRE' action_code,
'ACTIVE' status_type FROM dual
union all
select 4 id,
TO_DATE('21-AUG-2018', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('31-DEC-4712', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'TRANSFER' action_code,
'INACTIVE' status_type FROM dual
union all
select 4 id,
TO_DATE('21-AUG-2018', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('31-DEC-4712', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'TRANSFER' action_code,
'ACTIVE' status_type FROM dual
union all
select 4 id,
TO_DATE('01-NOV-2018', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') start_date,
TO_DATE('31-DEC-4712', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American') end_date,
'CHANGE_ASG' action_code,
'ACTIVE' status_type FROM dual)
SELECT a.id, a.start_date, a.end_date, a.action_code, a.status_type
FROM
(SELECT a.id, a.start_date, a.end_date, a.action_code, a.status_type,
row_number() over (partition by a.id order by start_date) rn
FROM mytbl a
WHERE NOT EXISTS
(SELECT 1
FROM mytbl b
WHERE b.status_type = 'INACTIVE'
AND a.id = b.id)) a
WHERE a.rn = 1
UNION ALL
SELECT a.id, a.start_date, a.end_date, a.action_code, a.status_type
FROM
(SELECT a.id, a.start_date, a.end_date, a.action_code, a.status_type,
row_number() over (partition by a.id order by start_date) rn
FROM mytbl a
WHERE EXISTS
(SELECT 1
FROM mytbl b
WHERE b.status_type = 'INACTIVE'
AND a.id = b.id
AND a.start_date > b.start_date)) a
WHERE a.rn = 1