有办法实现,只取距离当前日最近且数量合计大于等于一定值的数据吗?举例如下

image.png

以图片数据为例,我只需要该物料,数量合计>=20 的几条数据,也就是只需要红色框的数据,并求出时间差,有办法可以实现吗

FineReport 猴不是猴 发布于 2022-10-11 09:47 (编辑于 2022-10-11 09:58)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共7回答
最佳回答
0
lxy2Lv6中级互助
发布于2022-10-11 10:39

 select 

 *

 from (

select a1.*,

count(1) as 序号,

sum(a2.数量) as 总数量

 from 

(

select '2022-09-12' as 日期,'a' as 类型,4 as 数量

union all

select '2022-09-20' as 日期,'a' as 类型,5 as 数量

union all

select '2022-09-25' as 日期,'a' as 类型,7 as 数量

union all

select '2022-10-01' as 日期,'a' as 类型,12 as 数量

union all

select '2022-10-05' as 日期,'a' as 类型,12 as 数量

union all

select '2022-09-25' as 日期,'b' as 类型,25 as 数量

)a1 

left join 

(

select '2022-09-12' as 日期,'a' as 类型,4 as 数量

union all

select '2022-09-20' as 日期,'a' as 类型,5 as 数量

union all

select '2022-09-25' as 日期,'a' as 类型,7 as 数量

union all

select '2022-10-01' as 日期,'a' as 类型,12 as 数量

union all

select '2022-10-05' as 日期,'a' as 类型,12 as 数量

union all

select '2022-09-25' as 日期,'b' as 类型,25 as 数量

)a2 on a1.类型=a2.类型 and a1.日期<=a2.日期 

group by a1.日期,

a1.类型,

a1.数量

) b 

where 总数量<20 

or (

总数量>=20 

and  序号 in  (select min(序号) from 

(

select a1.*,

count(1) as 序号,

sum(a2.数量) as 总数量

 from 

(

select '2022-09-12' as 日期,'a' as 类型,4 as 数量

union all

select '2022-09-20' as 日期,'a' as 类型,5 as 数量

union all

select '2022-09-25' as 日期,'a' as 类型,7 as 数量

union all

select '2022-10-01' as 日期,'a' as 类型,12 as 数量

union all

select '2022-10-05' as 日期,'a' as 类型,12 as 数量

union all

select '2022-09-25' as 日期,'b' as 类型,25 as 数量

)a1 

left join 

(

select '2022-09-12' as 日期,'a' as 类型,4 as 数量

union all

select '2022-09-20' as 日期,'a' as 类型,5 as 数量

union all

select '2022-09-25' as 日期,'a' as 类型,7 as 数量

union all

select '2022-10-01' as 日期,'a' as 类型,12 as 数量

union all

select '2022-10-05' as 日期,'a' as 类型,12 as 数量

union all

select '2022-09-25' as 日期,'b' as 类型,25 as 数量

)a2 on a1.类型=a2.类型 and a1.日期<=a2.日期 

group by a1.日期,

a1.类型,

a1.数量

)  

 c where c.类型=b.类型 and c.总数量>=20 )

)

最佳回答
0
runerLv7资深互助
发布于2022-10-11 09:48

可以啊,先汇总求和,然后和当前时间求差,分组排序,取第一条

最佳回答
0
Z4u3z1Lv6专家互助
发布于2022-10-11 09:49

这是什么数据库?

  • 猴不是猴 猴不是猴(提问者) mysql
    2022-10-11 09:57 
  • Z4u3z1 Z4u3z1 回复 猴不是猴(提问者) 不熟。给你一个思路,多嵌套几次查询 SELECT * FROM ( SELECT A.*,(SELECT B.数量 FROM TABLE B WHERE A.物料代码=B.物料代码 AND B.RQ=20 SQL不一定正确哈
    2022-10-11 10:07 
最佳回答
0
RiveryLv5中级互助
发布于2022-10-11 09:59(编辑于 2022-10-11 10:01)

给你个思路,先用lag函数累计求和,然后取大于20的所有数据,然后用开窗函数根据物料分组取每个物料第一条大于20的数据

最佳回答
0
苑苑苑苑苑Lv6见习互助
发布于2022-10-11 10:01

最简单的用rank over partiton by函数

最佳回答
0
用户S5182147Lv6中级互助
发布于2022-10-11 10:22

可以先把日期区间求出来,然后过滤出想要时间区间的数据再求和

最佳回答
0
坚果联盟Lv4见习互助
发布于2022-10-11 11:26

要先取出合计>=20 的第一个值,比如上面例子,前3条合计是22,就取合计小于22的。

可以用lag函数,向下偏移,累计求和,取合计>=20的数据里面,合计的最小值,再取<=合计的最小值的数据,然后再求时间差

  • 6关注人数
  • 460浏览人数
  • 最后回答于:2022-10-11 11:26
    请选择关闭问题的原因
    确定 取消
    返回顶部