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
列中的值求和:
- 每行的
Id
小于 x
- 首先,将
BaseValue
添加到一个排序变量中,我们称之为y
- 然后对于每一行,将
Quantity
添加到y,如果结果小于0,y将是 0
我希望看到的结果是这样的:
如果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,程序应该如何工作如下:
- Y = 基值 + 0
- 用
Id=1
取直线,把直线Y和Quantity
加起来,结果是0.7,因为这个比0大,Y 现在是 0.7
- 取
Id=2
行,从行中Y和Quantity
求和,结果为-0.1,因为这个小于0, Y 现在是 0
- 用
Id=3
得到直线,把直线Y和Quantity
加起来,结果是0.5,这个比0大,所以停留
- 没有更多的行,因为
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 非常不言自明并且易于修改。
考虑以下 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
列中的值求和:
- 每行的
Id
小于 x - 首先,将
BaseValue
添加到一个排序变量中,我们称之为y - 然后对于每一行,将
Quantity
添加到y,如果结果小于0,y将是 0
我希望看到的结果是这样的:
如果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,程序应该如何工作如下:
- Y = 基值 + 0
- 用
Id=1
取直线,把直线Y和Quantity
加起来,结果是0.7,因为这个比0大,Y 现在是 0.7 - 取
Id=2
行,从行中Y和Quantity
求和,结果为-0.1,因为这个小于0, Y 现在是 0 - 用
Id=3
得到直线,把直线Y和Quantity
加起来,结果是0.5,这个比0大,所以停留 - 没有更多的行,因为
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 非常不言自明并且易于修改。