每次操作后的MySQL SUM和MIN
请考虑以下表结构:
|----------|-----------|----|
| Quantity | BaseValue | Id |
|----------|-----------|----|
| -0.3 | 1 | 1 |
| -0.8 | 1 | 2 |
| 0.5 | 1 | 3 |
| -0.2 | 1 | 4 |
|----------|-----------|----|
假设这是一个名为Transactions
的表。是否可以根据以下规则集对此表进行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操作之后,我希望看到下表,例如:
|----------|-----------|----|-----|
| 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=BaseValue+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非常简单易懂且易于修改。
Demo on db<>fiddle
相关文章