【问题标题】:Mysql - Sum of subset query with in a rangeMysql - 在一个范围内的子集查询的总和
【发布时间】:2020-09-27 00:00:15
【问题描述】:

我有一个包含示例数据的表格,如下所示:

| ID |        A |   B |
-----------------------
|  1 |      100 | 100 |
|  2 |      200 |  80 |
|  3 |      500 |   0 |
|  4 |      800 |   0 |

目标是我想要一个 SQL 查询,我可以输入一个值并获取 a 和 b 之差的总和的行,例如

示例 1.
如果输入 110
由于 (100 - 100) + (200 - 80) = 120 和 110 ,我将得到前两行 id 为 2 的行

示例 2.
如果输入 150 由于 (100 - 100) + (200 - 80) + (500 - 0) = 620 和 150 ,我将得到前两行 id 为 2,3

示例 3。 如果输入 620
由于 (100 - 100) + (200 - 80) + (500 - 0) = 620 和 620 ,我将得到前两行 id 为 2,3

示例 4.
如果输入 1000
由于 (100 - 100) + (200 - 80) + (500 - 0) + (800 - 0)= 1420 AND 1000 ,我将得到 id 为 2,3,4 的行

我参考了来自的查询 Sum subset query

答案非常接近,但结果仍然无法满足我的场景。我可以知道有人知道解决这个问题的语句是什么吗?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    从 MySQL 8.0 开始,您可以使用窗口函数来解决您的问题,例如:

    select * from (
        -- get rolling sum for columns A & B
        select
          id,
          A,
          B,
          SUM(A-B) over(order by ID) as rsum
        from test
    ) sums
    -- filter rows by value
    having rsum <= 620
    ;
    

    例如here

    【讨论】:

    • 很抱歉我的回复晚了,非常感谢您的帮助。由于我公司的服务器比较老,并且使用的是 MySQL 5.7,并且有不同的项目使用该服务器,所以可能不允许申请数据库升级。感谢您的解决方案,我会先在Mysql 8.0中尝试您的解决方案,看看是否能解决问题。
    猜你喜欢
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多