首页 > 解决方案 > 如何获得lastmodifier的最早日期?

问题描述

我选择获取最早的日期以及另一列的同一行,即 lastmodifier。这是否可以像 vlookup 一样获得相同的行数据。当我 MIN(DATE) 并将查找另一列相同行的值时。

我试图通过 lastmodifier 获取 min(date) 和 group。但是,我不知道脚本选择哪个 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

我想在每个订单号中选择第一个 lastmodifier。

标签: oraclepowerbi

解决方案


我不确定我是否理解正确,示例数据和预期输出对此类问题非常有帮助。但我认为你需要这个:

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,使用有条件countcase。但你的主要问题的答案是min ... keep ... first。它找到某列 ( lstmodifier) 的值,其中另一列 ( lstupdtime) 的值最低。min意味着如果两个运营商符合标准,我们必须选择一个人,所以我们按字母顺序排在第一位。我不知道在这种情况下你想做什么,这取决于不同的解决方案是否可行,例如使用rankand 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)

我使用较短substrcode操作来使事情变得清晰,而是使用 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

推荐阅读