MySQL 每次运算后的 SUM 和 MIN

MySQL SUM and MIN after each operation

考虑以下 table 结构:

|----------|-----------|----|
| Quantity | BaseValue | Id |
|----------|-----------|----|
|  -0.3    | 1         | 1  |
|  -0.8    | 1         | 2  |
|   0.5    | 1         | 3  |
|  -0.2    | 1         | 4  |
|----------|-----------|----|

假设这是一个 table,名为 Transactions。有什么方法可以根据以下规则集对此 table 进行 select 查询,这将对 Quantity 列中的值求和:

我希望看到的结果是这样的:

如果x是1,y应该是1
如果 x 是 2,y 应该是 0.7
如果 x 是 3,y 应该是 0
如果 x 是 4,y 应该是 0.5

在 select 操作之后,我希望看到以下 table 例如:

|----------|-----------|----|-----|
| Quantity | BaseValue | Id | Y   |
|----------|-----------|----|-----|
|  -0.3    | 1         | 1  | 1   |
|  -0.8    | 1         | 2  | 0.7 |
|   0.5    | 1         | 3  | 0   |
|  -0.2    | 1         | 4  | 0.5 |
|----------|-----------|----|-----|

我使用的MySQL版本是:10.2.16-MariaDB

示例:

假设 x 是 4,程序应该如何工作如下:

  1. Y = 基值 + 0
  2. Id=1取直线,把直线YQuantity加起来,结果是0.7,因为这个比0大,Y 现在是 0.7
  3. Id=2行,从行中YQuantity求和,结果为-0.1,因为这个小于0, Y 现在是 0
  4. Id=3得到直线,把直线YQuantity加起来,结果是0.5,这个比0大,所以停留
  5. 没有更多的行,因为 4 < x 不正确,所以 Y 是 0.5

这是一个基于递归 CTE 的解决方案:

WITH RECURSIVE rcte AS (
    SELECT base.*, (SELECT 1.0 /* AS BaseValue FROM other_table */) AS y
    FROM t AS base
    WHERE Id = 1
    UNION ALL
    SELECT curr.*, GREATEST(prev.Quantity + prev.y, 0)
    FROM t    AS curr
    JOIN rcte AS prev ON curr.Id = prev.Id + 1
)
SELECT *
FROM rcte

您不是很清楚 Quantity 和 BaseValue 列是指当前迭代还是先前迭代,但是 rcte 非常不言自明并且易于修改。

Demo on db<>fiddle