Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL每次操作后的总和和分钟数_Mysql_Sql_Mariadb_Recursive Query - Fatal编程技术网

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
    行,将求和每一行
  • 首先,将
    BaseValue
    添加到排序变量中,我们称之为y
  • 然后,对于每一行,将
    Quantity
    添加到y,如果结果小于0,y将为0
我希望看到的结果如下:

如果x是1,y应该是1
如果x为2,y0.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
    数量
    相加,结果为0.7,因为这大于0,Y现在为0.7
  • 使用
    Id=2
    获取一行,将该行的Y
    数量
    相加,结果为-0.1,因为该值低于0,Y现在为0
  • 使用
    Id=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
    应该是相同的,因为它是从一个联接表派生的。