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

Я выбираю получение самой ранней даты, а также той же строки другого столбца, который является последним модификатором.Возможно ли получить те же данные строки, что и vlookup.когда я MIN (DATE) и будет искать значение в той же строке другого столбца.

Я пытаюсь получить min (дата) и группу по lastmodifier.Однако я не знаю, какой последний модификатор выберет скрипт.

with CASECODESTATS (ORDBATCH,PO,EARLIEST,OPERATOR,count1,count2) as 
(
select substr(code,1,15),substr(code,1,14),MIN(LSTUPDTIME),LSTMODIFIER,COUNT(c.code) ,0
from casecode c
where c.state='REVIEWED'
group by substr(code,1,15),LSTMODIFIER,substr(code,1,14)


union all 

select substr(code,1,15),substr(code,1,14),MIN(LSTUPDTIME),LSTMODIFIER,0,COUNT(c.code)
from casecode c
where c.state ='WAREHOUSE RECEIVE'
group by substr(code,1,15),LSTMODIFIER,substr(code,1,14)
 )

select ORDBATCH ORBATCH,sum(count1) REVIEWED ,sum(count2) WAREHOUSERECIEVE,MIN(EARLIEST) EARLIESTDATE,OPERATOR LSTMODIFIER,PO ORDERNUM from CASECODESTATS

where 1=1
group by ORDBATCH,OPERATOR,PO

order by ORDBATCH

Я хочу выбрать 1-й последний модификатор в каждом номере заказа.

1 Ответ

0 голосов
/ 02 мая 2019

Я не уверен, правильно ли я понял, примерные данные и ожидаемый результат были бы очень полезны в этом вопросе. Но я думаю, что вам нужно это:

select substr(code, 1, 2) ordbatch, substr(code, 1, 1) ordernum, min(lstupdtime) earliest, 
       min(lstmodifier) keep (dense_rank first order by lstupdtime) lstmodifier,
       count(case state when 'REVIEWED' then 1 end) reviewed,
       count(case state when 'WAREHOUSE RECEIVE' then 1 end) warehouse
  from casecode 
  where state in ('REVIEWED', 'WAREHOUSE RECEIVE')
  group by substr(code,1,2), substr(code,1,1)

Первое: вам не нужно union, используйте условное count с case. Но ответ на ваш главный вопрос min ... keep ... first. Он находит значение некоторого столбца (lstmodifier), где значение другого столбца (lstupdtime) является самым низким. min означает, что если два оператора соответствуют критериям, мы должны выбрать кого-то, поэтому сначала мы выбираем в алфавитном порядке. Я не знаю, что вы хотите сделать в такой ситуации, в зависимости от того, возможны ли разные решения, например, с rank и listagg.

Вот пример:

with casecode(code, state, lstupdtime, lstmodifier) as (
    select 'A1', 'REVIEWED',          date '2018-12-25', 'Clark' from dual union all
    select 'A1', 'OTHER',             date '2018-12-25', 'Clark' from dual union all
    select 'A1', 'WAREHOUSE RECEIVE', date '2018-12-25', 'Clark' from dual union all
    select 'A1', 'WAREHOUSE RECEIVE', date '2018-12-24', 'Jones' from dual union all
    select 'B1', 'WAREHOUSE RECEIVE', date '2018-12-25', 'Clark' from dual union all
    select 'B2', 'WAREHOUSE RECEIVE', date '2018-12-25', 'Clark' from dual 
  )
select substr(code, 1, 2) ordbatch, substr(code, 1, 1) ordernum, min(lstupdtime) earliest, 
       min(lstmodifier) keep (dense_rank first order by lstupdtime) lstmodifier,
       count(case state when 'REVIEWED' then 1 end) reviewed,
       count(case state when 'WAREHOUSE RECEIVE' then 1 end) warehouse
  from casecode 
  where state in ('REVIEWED', 'WAREHOUSE RECEIVE')
  group by substr(code,1,2), substr(code,1,1)

Я использовал более короткую substr для манипуляции code, чтобы прояснить ситуацию, вместо этого используйте 14 и 15. Джонс выбран, потому что его lstupdtime является самым низким:

ORDBATCH ORDERNUM EARLIEST    LSTMODIFIER   REVIEWED  WAREHOUSE
-------- -------- ----------- ----------- ---------- ----------
A1       A        2018-12-24  Jones                1          2
B1       B        2018-12-25  Clark                0          1
B2       B        2018-12-25  Clark                0          1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...