假设我有一个按date升序排序的表items

date item quantity cost
2022-12-01 Pencil 12 10.00
2022-12-02 Pencil 10 10.00
2022-12-04 Pencil 5 10.00
2022-12-06 Eraser 10 4.00
2022-12-10 Eraser 50 4.00
2022-12-15 Eraser 25 4.00

我需要编写一个SQL查询,该查询返回一个名为calculated_cost的计算字段,其中的表达式仅为quantity*cost

然后,我需要为每一行增加calculated_cost,并将其保存到名为accumulated_cost的字段中

然而,这是一个挑战,我还需要存储一个名为previous_accumulated_cost的字段,其中包含前面的accumulated_cost,并将其存储为值.

请注意,我还需要通过基于item的分区和按date排序来计算这些值,这意味着当我到达一个新项时,我需要重置accumulated_costprevious_accumulated_cost.

基本上,我需要生成这样的输出.

date item quantity cost calculated_cost accumulated_cost previous_accumulated_cost
2022-12-01 Pencil 12 10.00 120.00 120.00 0.00
2022-12-02 Pencil 10 10.00 100.00 220.00 120.00
2022-12-04 Pencil 5 10.00 50.00 270.00 220.00
2022-12-06 Eraser 10 4.00 40.00 40.00 0.00
2022-12-10 Eraser 50 4.00 200.00 240.00 40.00
2022-12-15 Eraser 25 4.00 100.00 340.00 240.00

我已经try 过这样的SQL查询

SELECT *,
   (i.quantity * i.cost) AS calculated_cost,
   SUM(i.quantity * i.cost) OVER (PARTITION BY i.item ORDER BY i.date) AS accumulated_cost,
   IFNULL(LAG(i2.accumulated_cost) OVER (PARTITION BY i.item ORDER BY i.date), 0) AS previous_accumulated_cost
FROM items i
LEFT JOIN (
   SELECT item, SUM(quantity * cost) OVER (PARTITION BY item ORDER BY date) AS accumulated_cost
   FROM items 
) i2 ON i.item = i2.item

然而,这并不起作用,因为条目的数量可能会继续增加,而我不确定如何继续引用previous_accumulated_cost

希望能得到一些帮助.谢谢!

推荐答案

你使用解析函数的直觉是正确的.我建议使用这个版本:

SELECT
    quantity * cost AS calculated_cost,
    SUM(quantity * cost) OVER (PARTITION BY item ORDER BY date) AS accumulated_cost,
    SUM(quantity * cost) OVER (PARTITION BY item ORDER BY date) - (quantity * cost) AS previous_accumulated_cost
FROM items
ORDER BY item, date;

理解previous_accumulated_cost仅仅是accumulated_cost减go calculated_cost.

Mysql相关问答推荐

S优化联接更新的最佳方式是什么?

优化使用ORDER BY加载耗时较长的MySQL请求

奇怪的MySQL SELECT循环;但不是\G

如何创建一个列,该列在另一个表中具有值的计数?

"Shelf服务器容器访问MySQL Docker容器时出现SocketException异常"

将时间戳四舍五入到最接近的半小时而不遗漏丢失的数据

Select 同一张表中的结果数?

生成直到 10 的平方数序列

在 MySQL 中使用非空条件 LAG() 函数

如何使用 DBD::mysql 判断 MySQL 服务是否正在运行

在 Codeigniter MySQL 中从另一个数据库获取数据

如何知道 Select 查询花费了多少时间?

MYSQL 或 Laravel Eloquent 如何从这个订单中统计细节

Select 在同一天售出不同活动门票的收银员

默认为空字符串的列

将 JavaScript 到日期对象转换为 MySQL 日期格式 (YYYY-MM-DD)

考虑到 NodeJS,MySQL 和 MySQL2 有什么区别

MySQL获取两个值之间的随机值

从另一个表中 Select 具有 id 的行

MySQL CREATE TABLE 语句中的 PRIMARY KEY 定义