每个操作后的mysql总和和最小值



考虑下表结构:

|----------|-----------|----|
| 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,程序应如何工作如下:

  1. y = basevalue 0
  2. Id=1一起加入线,总和 y Quantity从该行中,结果为0.7,因为它比0, y 现在为0.7
  3. Id=2一起加入线,总和 y Quantity从该行中,结果为-0.1,因为它比0, y 现在0
  4. Id=3获取线,总和在一起 y Quantity从该行中,结果为0.5,它大于0,所以它保持
  5. 不再需要采用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

上的演示

最新更新