2015-08-19 5 views
2

Мне нужно выполнить один запрос Oracle оракула, который вернет значение поля из другой записи, если запись соответствует определенным критериям из текущей записи. Эти данные извлекаются из СУБД Oracle SQL в Excel через соединение ODBC для генерации отчетов. В настоящее время я вытаскиваю все данные из таблицы и обрабатываю их в excel, но количество записей увеличилось до такой степени, что это уже не жизнеспособный вариант. (Примерно 1/4 млн)Oracle выбрать поле в другой записи на основе текущей записи

SOURCE TABLE 
------------------------------------------------------------------------------------------- 
|major |minor |step |currentUser |NextUser |comment   |stage |action |timestamp | 
------------------------------------------------------------------------------------------- 
|475 |13 |1 |jim   |bob  |request created |QA |submit |12-19-2005| 
|475 |13 |2 |bob   |james |request approved |RA |accept |12-20-2005| 
|475 |13 |3 |james  |bob  |data submitted  |QA |submit |12-21-2005| 
|475 |13 |4 |   |james |rejected: thisISwhy|RA |accept |12-22-2005| 
|475 |13 |5 |James  |bob  |data submitted  |QA |submit |12-23-2005| 
|475 |13 |6 |   |jim  |data approved  |SC |complete|12-24-2005| 
|475 |13 |6 |   |   |request closed  |SC |closed |12-24-2005| 
------------------------------------------------------------------------------------------- 

В основном, джим посылает запрос к Джеймсу, но боб одобряет или отклоняет каждый шаг по пути. Здесь представлено 3 сообщения, поэтому мне нужны только 3 записи, но некоторые данные поступают из данных в поле из другой записи. в настоящее время jim получает 1 подарок и 0 отказов, а james получает 2 отправления и 1 отказ. ЗДЕСЬ. CATCH: Если bob отвергает подачу james, запрос может быть переназначен на sally, и система, которая сохраняет эти данные задним числом assgins, как nextUser на шаге 4, который сделает APPEAR, что sally получил отказ, но это был james, который отправил в ошибке. В этом случае jim, james и sally все получают 1, но у james есть 1 отказ. Это то, что мне это нужно для вывода (2 последнего filds «1» противопоказаны флаги для числа ПРЕДСТАВЛЯЕТ и отклоняет для отчета)

-------------------------------------------------------------------------------------- 
|major |minor |step |submiter |QA_rep|comment   |timestamp |submit |reject | 
-------------------------------------------------------------------------------------- 
|475 |13 |1 |jim  |bob |thing created  |12-19-2005 |1  |  | 
|475 |13 |3 |james |bob |rejected: thisISwhy|12-22-2005 |1  |1  | 
|475 |13 |5 |james |bob |data approved  |12-22-2005 |1  |  | 
-------------------------------------------------------------------------------------- 
+0

Было бы полезно, если бы вы могли обновить свои данные ввода и вывода образца, чтобы продемонстрировать случай, когда отклоненное представление назначено кому-то другому. – Boneist

ответ

0

Я принял догадку на некоторых из логики (Уилла у отклоненной строки всегда есть комментарий, начинающийся с «reject:»? Также было бы принято «действие» для отклоненной строки? Я также сделал некоторые предположения, что для представленной строки «nextuser» является пользователем qa; вам может потребоваться добавить некоторые дополнительные заявления о случаях, если это не всегда так. Я догадался о вашем случае, когда строка отклоняется и назначается кому-то другому.

Если какое-либо из моих допущений неверно , надеюсь, вы сможете изменить мой запрос в соответствии с вашими потребностями.

with source_table as (select 475 major, 13 minor, 1 step, 'jim' currentuser, 'bob' nextuser, 'request created' request_comment, 'QA' stage, 'submit' action, to_date('19/12/2005', 'dd/mm/yyyy') dt from dual union all 
         select 475 major, 13 minor, 2 step, 'bob' currentuser, 'james' nextuser, 'request approved' request_comment, 'RA' stage, 'accept' action, to_date('20/12/2005', 'dd/mm/yyyy') dt from dual union all 
         select 475 major, 13 minor, 3 step, 'james' currentuser, 'bob' nextuser, 'data submitted' request_comment, 'QA' stage, 'submit' action, to_date('21/12/2005', 'dd/mm/yyyy') dt from dual union all 
         select 475 major, 13 minor, 4 step, null currentuser, 'james' nextuser, 'rejected: thisISwhy' request_comment, 'RA' stage, 'accept' action, to_date('22/12/2005', 'dd/mm/yyyy') dt from dual union all 
         select 475 major, 13 minor, 5 step, 'james' currentuser, 'bob' nextuser, 'data submitted' request_comment, 'QA' stage, 'submit' action, to_date('23/12/2005', 'dd/mm/yyyy') dt from dual union all 
         select 475 major, 13 minor, 6 step, null currentuser, 'jim' nextuser, 'data approved' request_comment, 'SC' stage, 'complete' action, to_date('24/12/2005', 'dd/mm/yyyy') dt from dual union all 
         select 475 major, 13 minor, 6 step, null currentuser, null nextuser, 'request closed' request_comment, 'SC' stage, 'closed' action, to_date('24/12/2005', 'dd/mm/yyyy') dt from dual union all 
         select 475 major, 14 minor, 1 step, 'jim' currentuser, 'bob' nextuser, 'request created' request_comment, 'QA' stage, 'submit' action, to_date('19/12/2005', 'dd/mm/yyyy') dt from dual union all 
         select 475 major, 14 minor, 2 step, 'bob' currentuser, 'james' nextuser, 'request approved' request_comment, 'RA' stage, 'accept' action, to_date('20/12/2005', 'dd/mm/yyyy') dt from dual union all 
         select 475 major, 14 minor, 3 step, 'james' currentuser, 'bob' nextuser, 'data submitted' request_comment, 'QA' stage, 'submit' action, to_date('21/12/2005', 'dd/mm/yyyy') dt from dual union all 
         select 475 major, 14 minor, 4 step, null currentuser, 'sally' nextuser, 'rejected: thisISwhy' request_comment, 'RA' stage, 'accept' action, to_date('22/12/2005', 'dd/mm/yyyy') dt from dual union all 
         select 475 major, 14 minor, 5 step, 'sally' currentuser, 'bob' nextuser, 'data submitted' request_comment, 'QA' stage, 'submit' action, to_date('23/12/2005', 'dd/mm/yyyy') dt from dual union all 
         select 475 major, 14 minor, 6 step, null currentuser, 'jim' nextuser, 'data approved' request_comment, 'SC' stage, 'complete' action, to_date('24/12/2005', 'dd/mm/yyyy') dt from dual union all 
         select 475 major, 14 minor, 6 step, null currentuser, null nextuser, 'request closed' request_comment, 'SC' stage, 'closed' action, to_date('24/12/2005', 'dd/mm/yyyy') dt from dual), 
       res as (select major, 
          minor, 
          step, 
          currentuser, 
          nextuser, 
          request_comment, 
          dt, 
          stage, 
          action, 
          lead(request_comment) over (partition by major, minor order by step) next_comment, 
          case when lead(request_comment) over (partition by major, minor order by step) like 'rejected:%' then 1 end rejected 
         from source_table) 
select major, 
     minor, 
     step, 
     currentuser submitter, 
     nextuser qa_rep, 
     next_comment request_comment, 
     dt, 
     1 submit, 
     rejected 
from res 
where action = 'submit'; 

    MAJOR  MINOR  STEP SUBMITTER QA_REP REQUEST_COMMENT  DT    SUBMIT REJECTED 
---------- ---------- ---------- --------- ------ ------------------- ---------- ---------- ---------- 
     475   13   1 jim  bob request approved 19/12/2005   1   
     475   13   3 james  bob rejected: thisISwhy 21/12/2005   1   1 
     475   13   5 james  bob data approved  23/12/2005   1   
     475   14   1 jim  bob request approved 19/12/2005   1   
     475   14   3 james  bob rejected: thisISwhy 21/12/2005   1   1 
     475   14   5 sally  bob data approved  23/12/2005   1