Mysql 如何从上一行的相同列值中选择列值最近减少的行?
我有一组库存数据,其中金额以给定的速率增加。例如,库存每天增加10个单位。然而,不时会有任何数量的库存减少。我需要一个查询,可以找到我最近的库存减少,并返回给我的总和扣除 我的表格包含许多项目id的日期和金额。理论上,我试图做的是为给定的项目ID选择所有金额和日期,然后找出两天库存之间最近减少的差异。由于跟踪了多个项目,因此无法保证一组项目的id列是连续的 为了找到解决办法而进行的研究已经完全铺天盖地。看起来窗口函数可能是一个很好的尝试途径,但我从未使用过它们,甚至不知道从哪里开始 虽然我可以很容易地返回数量并用PHP进行计算,但我觉得正确的做法是利用SQL,但我对更复杂查询的经验有限Mysql 如何从上一行的相同列值中选择列值最近减少的行?,mysql,sql,Mysql,Sql,我有一组库存数据,其中金额以给定的速率增加。例如,库存每天增加10个单位。然而,不时会有任何数量的库存减少。我需要一个查询,可以找到我最近的库存减少,并返回给我的总和扣除 我的表格包含许多项目id的日期和金额。理论上,我试图做的是为给定的项目ID选择所有金额和日期,然后找出两天库存之间最近减少的差异。由于跟踪了多个项目,因此无法保证一组项目的id列是连续的 为了找到解决办法而进行的研究已经完全铺天盖地。看起来窗口函数可能是一个很好的尝试途径,但我从未使用过它们,甚至不知道从哪里开始 虽然我可以很
ID | ItemID | Date | Amount
1 2 2019-05-05 25
7 2 2019-05-06 26
34 2 2019-05-07 14
35 2 2019-05-08 15
67 2 2019-05-09 16
89 2 2019-05-10 5
105 2 2019-05-11 6
鉴于上述数据,最好能看到如下结果:
item id | date | reduction
2 2019-05-10 11
这是因为最近一次库存减少发生在id 67和89之间,并且减少的金额在2019年5月10日为11。在MySQL 8+中,您可以使用
lag()
:
select t.*, (prev_amount - amount) as reduction
from (select t.*,
lag(amount) over (partition by itemid order by date) as prev_amount
from t
) t
where prev_amount > amount
order by date desc
limit 1;