Я думаю, вам нужен еще один столбец, например время или дополнительный идентификатор или сумма, для заказа при отображении данных.Чтобы обеспечить этот критерий, я добавил столбец времени (time
) к вашим данным, как показано ниже:
with t(empid,headerid,status,time) as
(
select 1,123,'Failed' , '2019-06-22 17:00:00' from dual union all
select 1,321,'Pending', '2019-06-22 17:10:00' from dual union all
select 1,555,'Pending', '2019-06-22 17:20:00' from dual union all
select 1,111,'Failed' , '2019-06-22 17:30:00' from dual union all
select 1,222,'Pending', '2019-06-22 17:40:00' from dual union all
select 2,333,'Failed' , '2019-06-22 17:50:00' from dual union all
select 2,444,'Pending', '2019-06-22 18:00:00' from dual union all
select 3,555,'Failed' , '2019-06-22 18:10:00' from dual
), t2 as
(
select sum(case when status = 'Failed' then 1 else 0 end)
over (partition by empid order by time) as rn,
t.*
from t
)
select *
from t2
where (rn, empid) in
( select rn, empid
from t2
where empid = &i_empid -- 1
and headerid = &i_headerid -- 123
and status = 'Failed' )
order by time;
вы можете заменить 1
& 123
или 1
& 111
или 2
& 333
или 3
& 555
соответственно, как вы хотите.
Демо
Отредактируйте ( из-за вашего комментария ):
Если вы хотите вернуть первую строку со статусом Pending
сразу после той, у которой статус Failed
, вы можете попробовать использовать:
with t(empid,headerid,status,time) as
(
select 1,123,'Failed' , '2019-06-22 17:00:00' from dual union all
select 1,321,'Pending', '2019-06-22 17:10:00' from dual union all
select 1,555,'Pending', '2019-06-22 17:20:00' from dual union all
select 1,111,'Failed' , '2019-06-22 17:30:00' from dual union all
select 1,222,'Pending', '2019-06-22 17:40:00' from dual union all
select 2,333,'Failed' , '2019-06-22 17:50:00' from dual union all
select 2,444,'Pending', '2019-06-22 18:00:00' from dual union all
select 3,555,'Failed' , '2019-06-22 18:10:00' from dual
), t2 as
(
select sum(case when status = 'Failed' then 1 else 0 end)
over (partition by empid order by time) as rn,
t.*
from t
), t3 as
(
select t2.*,
row_number() over (partition by empid,rn,status order by time) as rn2
from t2
)
select *
from t3
where (rn,rn2, empid) in
( select rn,rn2, empid
from t3
where empid = 1--&i_empid
and headerid = 123 -- &i_headerid
and status = 'Failed'
)
and status = 'Pending';
снова вы можете подставить те же значения, что и в предыдущем запросе.