mysql - 如何从前一行的相同列值中选择列值最近减少的行?
问题描述
我有一组库存数据,其中数量以给定的速度增加。例如,库存每天增加十个单位。但是,不时会出现任何数量的库存减少。我需要一个查询,它可以找到我最近的库存减少并将该扣除的总和返回给我。
我的表包含许多项目 ID 的日期和金额。从理论上讲,我要做的是选择给定项目 ID 的所有金额和日期,然后找到最近两天库存减少之间的差异。由于跟踪了多个项目,因此不能保证 id 列对于一组项目是连续的。
研究以找到解决此问题的方法完全是压倒性的。似乎窗口函数可能是一个很好的尝试途径,但我从未使用过它们,甚至不知道从哪里开始。
虽然我可以轻松地返回金额并在 PHP 中进行计算,但我觉得在这里做的正确事情是利用 SQL,但我对更复杂查询的经验有限。
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;
推荐阅读
- excel - Excel将按钮变成图像
- json - 如果先前的命令在 gitlab 脚本中发现无效文件,如何失败?
- python - 当我运行它的 .py 文件时,无法在 python 中写入文件。但是当我在pycharm中运行它时,它确实有效
- javascript - 限制列表中每个数字最多 5 位数字
- django-rest-framework - 身份验证成功后,如何返回从自定义用户子类化的 Django 用户?
- google-bigquery - 基于 BigQuery 中其他字段整数的 DateSub 函数
- python - 为什么减去日期时间会产生溢出错误?
- azure - 将 Azure Functions 与事件中心链集成的最佳参数是什么
- python - Python:在迭代标准输出时从子进程中捕获异常
- iis - 在发布托管在 IIS 中的 blazor 程序集应用程序 ASP.NET CORE 后,我收到了 DirectoryNotFoundException 错误