上的演示
考虑下表结构:
|----------|-----------|----|
| Quantity | BaseValue | Id |
|----------|-----------|----|
| -0.3 | 1 | 1 |
| -0.8 | 1 | 2 |
| 0.5 | 1 | 3 |
| -0.2 | 1 | 4 |
|----------|-----------|----|
假设这是一张名为Transactions
的表。是否有任何方法可以在此表上进行选择查询,可以根据以下规则集在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
选择操作后,我想查看下表:
|----------|-----------|----|-----|
| 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
您尚不清楚数量和基本价值列是指当前迭代还是以前的迭代,但RCTE是非常自我解释且易于修改的。
db&lt;> fiddle