oracle - 如何获得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。
解决方案
我不确定我是否理解正确,示例数据和预期输出对此类问题非常有帮助。但我认为你需要这个:
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
and 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
推荐阅读
- list - 使用变量引用列表名称
- react-native - 在 React Navigation v5 中的内部堆栈/选项卡上禁用 DrawerNavigator 滑动手势
- mysql - 在日期查询中包含 WHERE 子句
- java - 从方法返回多个系列
- c# - 当我尝试打开 PDF 时,Xamarin C#“我们无权打开此文件”
- azure-blob-storage - ADLS Gen2 上的 Polybase - CSV 文件作为源失败并出现“HdfsBridge::recordReaderFillBuffer”错误
- javascript - 异步调用后如何自动对焦选择输入?
- angular - 单个水疗中心不会同时显示两个应用程序
- python - 无法将 NumPy 数组转换为张量(不支持的对象类型浮点数)
- r - 如果满足三个条件,R子集3d数组并修改特定值