Как получить записи динамически на основе нескольких критериев фильтра - PullRequest
0 голосов
/ 22 июня 2019

У меня есть таблица ниже:

enter image description here

Не могли бы вы помочь мне, как получить результаты динамически для следующих сценариев?

Если я предоставлю Emp = 1 и HeaderID = 123 и Status = Failed, он должен вернуть результаты следующим образом:

image1 321 Pending 1 555 Pending 2.">

Если я предоставлю Emp = 1 и HeaderID = 111 и status = Failed, он должен вернуть результаты следующим образом:

enter image description here

Заранее спасибо, пожалуйста.

1 Ответ

0 голосов
/ 22 июня 2019

Я думаю, вам нужен еще один столбец, например время или дополнительный идентификатор или сумма, для заказа при отображении данных.Чтобы обеспечить этот критерий, я добавил столбец времени (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';

снова вы можете подставить те же значения, что и в предыдущем запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...