【问题标题】:MySQL SUM and MIN after each operation每次操作后的 MySQL SUM 和 MIN
【发布时间】:2019-02-13 12:39:16
【问题描述】:

考虑下面的表结构:

|----------|-----------|----|
| 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的直线,把直线上的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

【问题讨论】:

  • 您使用的是哪个版本的 MySQL?
  • 你能编辑你的问题吗 - 把工作放在那里,可能更清楚
  • 我头疼:-(
  • 这个东西如果通过一些编程/编码计算会更好。用 sql 做这件事对我来说听起来不合适。我仍然觉得它很有趣并尝试通过 sql 来完成
  • 似乎是程序计算而不是关系..所以建议应该使用服务器端编程代码来完成

标签: mysql sql mariadb recursive-query


【解决方案1】:

这是一个基于递归 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

【讨论】:

  • @AdamBaranyai 如果BaseValue 对于所有Iddbfiddle.uk/… 都不相同,我不确定它是否有效
  • @Nick 我没有对此进行测试,但 BaseValue 应该是相同的,因为它是从连接表派生的。
猜你喜欢
  • 2011-06-15
  • 2017-08-27
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多