考虑以下表结构:
|----------|-----------|----|
| 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
to y,如果结果小于 0,y将是 0
我希望看到的结果是这样的:
if x is 1, y应该1
if x is 2, y应该0.7
if x is 3, y应该0
if x is 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
Example:
比方说x是 4,程序应该如何工作如下:
- Y = 基础值 + 0
- 与
Id=1
, 总和Y and Quantity
从线上来看,结果是 0.7,因为它比 0 大,Y现在是 0.7
- 与
Id=2
, 总和Y and Quantity
从线上来看,结果是 -0.1,因为它低于 0,Y现在是 0
- 与
Id=3
, 总和Y and Quantity
从线上来看,结果是 0.5,这比 0 大,所以它保持不变
- 不再需要任何线条
4 < x
不是真的,所以Y is 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 非常不言自明且易于修改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)