每次操作后的MySQL SUM和MIN [英] MySQL SUM and MIN after each operation

查看:45
本文介绍了每次操作后的MySQL SUM和MIN的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请考虑以下表结构:

|----------|-----------|----|
| 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得到直线,将YQuantity从该行求和,结果是0.7,因为这个大于0,Y现在是0.7
  3. Id=2求行,YQuantity相加,结果是-0.1,因为这个小于0,Y现在是0
  4. Id=3取行,将YQuantity行相加,结果为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

这篇关于每次操作后的MySQL SUM和MIN的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆