SQL计算同指令下最晚完成时间及状态个数和完成情况。

 现有的数据源只有三个字段,指令,状态,完成时间,
需要需要这三个字段,新增5个字段并得出结果。
1、最晚完成时间:计算逻辑,查找当前指令下最晚完成的时间,如果当前指令下有完成时间是空值的时候,那完成时间为空,否则显示最晚完成时间。
2、包含V\H状态是未完成:计算逻辑:查询当前指令下状态如果有包含V\H状态的,那当前指令就显示未完成,否则就是完成。
3、B\C个数:计算逻辑:查询当前指令下状态如果有包含B\C态的个数。
4、A\D个数:计算逻辑:查询当前指令下状态如果有包含A\D态的个数。
5、 除B\C\A\D外的个数:计算逻辑:查询当前指令下状态不包含B\C\A\D状态的个数。

指令状态完成日期最晚完成时间V\H状态是未完成B\C个数A\D个数除B\C\A\D外的个数
A10000A2022/1/2 13:00未完成231
A10000B2022/1/2 13:00未完成231
A10000C2022/1/2 13:00未完成231
A10001D2022/1/2 13:002022/1/2 13:20完成033
A10001F2022/1/2 13:002022/1/2 13:20完成033
A10000A2022/1/2 13:00未完成231
A10000V2022/1/2 13:00未完成231
A10000A2022/1/2 13:00未完成231
A10001D2022/1/2 13:002022/1/2 13:20完成033
A10001E2022/1/2 13:002022/1/2 13:20完成033
A10001R2022/1/2 13:102022/1/2 13:20完成033
A10001D2022/1/2 13:202022/1/2 13:20完成033
A10002S2022/1/2 13:202022/1/2 13:20完成001

是什么数据库?版本多少?


只要是支持开窗函数的数据库,都可以用下面的方式来查询

select t.*,
last_value(完成日期) over(partition by 指令 order by 完成日期) 最晚完成时间,
case when (count(case when 状态 in ('V','H') THEN 1 END ) OVER (partition by 指令))>0 THEN '未完成' else '完成' end 完成状态,
count(case when 状态 in ('B','C') THEN 1 END ) OVER (partition by 指令) BC个数,
count(case when 状态 in ('A','D') THEN 1 END ) OVER (partition by 指令) AD个数,
count(case when 状态 NOT  in ('A','B','C','D') THEN 1 END ) OVER (partition by 指令) 除ABCD个数
from t

关联几个子查询就搞定了,第一个根据指令分组取最大的时间。第二个where一下vh,第三个where一下bc然后count