Я не уверен, правильно ли я понял, примерные данные и ожидаемый результат были бы очень полезны в этом вопросе. Но я думаю, что вам нужно это:
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