每次操作后的MySQL SUM和MIN

2022-02-24 00:00:00 sql mariadb mysql recursive-query

请考虑以下表结构:

|----------|-----------|----|
| 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,程序的工作方式如下:

  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

您不太清楚Quantity和BaseValue列是指当前迭代还是指上一次迭代,但RCTE非常简单易懂且易于修改。

Demo on db<>fiddle

相关文章