我有一个水果表,有 2 列日期和数量。它表示水果添加到库存的日期。
产品按照先进先出原则销售。
如果我想根据先进先出原则出售 40 个苹果,对于以下场景,我应该编写什么 sql 查询?我期待返回记录 1,2,3
+-id-+----date----+---quantity--+
1 | 02/05/2015 | 10
2 | 03/05/2015 | 20
3 | 04/05/2015 | 30
4 | 05/05/2015 | 30
select * from fruit where quantity less than < 40 order by date asc
//returns record 1 and 2 only.
最佳答案
- 我们首先使用 Session variables 计算滚动总和.
- 然后,使用 Derived table 中的结果集,并找到总和跨越“障碍”40 的日期。当新滚动总和大于或等于 40 时,就达到障碍。此时,我们将障碍值设置为 1,将其之前的行设置为 0,并且2 及更多,用于后面的行。
date
是 MySQL 中的关键字。你真的应该避免使用它作为表名;否则使用反引号括起来
尝试(适用于所有 MySQL 版本):
SELECT dt.id,
dt.`date`,
dt.quantity
FROM
(
SELECT
f.id,
f.`date`,
f.quantity,
@barrier := CASE
WHEN
(@tot_qty := @tot_qty + f.quantity) >= 40
THEN (@barrier + 1)
ELSE 0
END AS barrier
FROM
Fruit AS f
CROSS JOIN (SELECT @tot_qty := 0,
@barrier := 0) AS user_init
ORDER BY f.`date`
) AS dt
WHERE dt.barrier <= 1
DB Fiddle DEMO
关于mysql根据预期库存返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52967205/