MySQL每次操作后的总和和分钟数
考虑下表结构:MySQL每次操作后的总和和分钟数,mysql,sql,mariadb,recursive-query,Mysql,Sql,Mariadb,Recursive Query,考虑下表结构: |----------|-----------|----| | Quantity | BaseValue | Id | |----------|-----------|----| | -0.3 | 1 | 1 | | -0.8 | 1 | 2 | | 0.5 | 1 | 3 | | -0.2 | 1 | 4 | |----------|-----------|----| 假
|----------|-----------|----|
| Quantity | BaseValue | Id |
|----------|-----------|----|
| -0.3 | 1 | 1 |
| -0.8 | 1 | 2 |
| 0.5 | 1 | 3 |
| -0.2 | 1 | 4 |
|----------|-----------|----|
假设这是一个表,名为事务
。是否有方法在此表上进行select查询,该查询将根据以下规则集对Quantity
列中的值求和:- 对于Id小于x的
行,将求和每一行Id
- 首先,将
添加到排序变量中,我们称之为yBaseValue
- 然后,对于每一行,将
添加到y,如果结果小于0,y将为0Quantity
如果x是1,y应该是1
如果x为2,y应0.7
如果x是3,y应该是0
如果x是4,y应该是0.5
选择操作后,我希望看到下表,例如:
|----------|-----------|----|-----|
| 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,程序应如何工作如下:
Id=1
获取行,将行中的Y和数量
相加,结果为0.7,因为这大于0,Y现在为0.7Id=2
获取一行,将该行的Y和数量
相加,结果为-0.1,因为该值低于0,Y现在为0Id=3
获取行,将行中的Y和数量
相加,结果为0.5,大于0,因此它保持不变4
不是真的,所以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非常容易解释和修改
您使用的是哪个版本的MySQL?您可以编辑您的问题吗?将工作放在那里,可能会比较清楚。我的头很痛:-(如果通过一些编程/编码来计算,这件事可能会更好。用sql来做这件事对我来说听起来不太合适。不过我觉得它很有趣&尝试通过sql来做这件事似乎是一个过程性的计算,而不是关系性的。因此,正如建议的那样,应该使用服务器端编程来完成code@AdamBaranyai如果
BaseValue
对于所有Id
values@Nick我没有用它进行测试,但是BaseValue
应该是相同的,因为它是从一个联接表派生的。