如何获取MySQL行,直到某一列的总和超过阈值?

如何获取MySQL行,直到某一列的总和超过阈值?,mysql,sum,subquery,Mysql,Sum,Subquery,我一直在StackOverflow中搜索,找到的最近的一个是。但建议的解决方案有两个缺点 桌子 +----+-------+-------------+ |id | type | MyAmountCol| +----+-------+-------------+ | 1 | 85482 | 10 | +----+-------+-------------+ | 2 | 47228 | 20 | +----+-------+-------------+ |

我一直在StackOverflow中搜索,找到的最近的一个是。但建议的解决方案有两个缺点

桌子

+----+-------+-------------+
|id | type | MyAmountCol|
+----+-------+-------------+
| 1  | 85482 | 10          |
+----+-------+-------------+
| 2  | 47228 | 20          |
+----+-------+-------------+
| 3  | 12026 | 40          |
+----+-------+-------------+

  • 当每一行都不能满足条件时(即,如果每个值都大于阈值),则不返回任何行
  • 查询
  • 当条件被捕获在中间时(即前两个值为10和20,阈值为15),返回值之和总是小于或等于阈值。
  • 查询 期望的结果是这样的。在第一个fiddle示例中,我希望返回第一行(id=
    1
    ,type=
    85842
    )。在第二个fiddle示例中,我希望返回id=
    1
    、type=
    85842
    和id=
    2
    、type=
    47228
    的行


    换言之,我试图做的与我发现的略有不同,而且似乎无法通过这种方法实现。我希望超过目标值的连续行数最少。只有MySQL(查询)可以解决这个问题吗,或者我应该在应用程序级别解决这个问题吗?

    使用较小的ID将表连接到自身(因为这就是您要排序的内容),对连接中的所有行求和,并保留总和小于(不小于或等于)阈值的行:

    SELECT
      a.Id,
      a.Type,
      a.MyAmountCol
    FROM Table1 a
    LEFT JOIN Table1 b on b.id < a.id
    GROUP BY 1,2,3
    HAVING COALESCE(SUM(b.MyAmountCol), 0) < 15
    
    选择
    a、 身份证,
    a、 类型,
    a、 没食子酸
    来自表1 a
    b.id
    添加
    COALESCE()
    调用是为了满足最低id的需要,我们希望(始终)保持最低id,它没有行可连接


    免责声明:代码可能无法编译或工作,因为它是在我的手机上按拇指插入的(但它很有可能工作)

    在较小的ID上将表连接到自身(因为这是您在排序的内容),对连接中的所有行求和,并保留总和小于(不小于或等于)阈值的行:

    SELECT
      a.Id,
      a.Type,
      a.MyAmountCol
    FROM Table1 a
    LEFT JOIN Table1 b on b.id < a.id
    GROUP BY 1,2,3
    HAVING COALESCE(SUM(b.MyAmountCol), 0) < 15
    
    选择
    a、 身份证,
    a、 类型,
    a、 没食子酸
    来自表1 a
    b.id
    添加
    COALESCE()
    调用是为了满足最低id的需要,我们希望(始终)保持最低id,它没有行可连接


    免责声明:代码可能无法编译或工作,因为它是在我的手机上登录的(但有一个合理的机会它会工作)

    请以表格或任何方式显示您的预期输出(以理解)。@s_sauden感谢您的评论。在第一个fiddle示例中,我希望返回类型为
    85842
    (id=1)的行。从第二个例子fiddle中,我希望返回类型为
    85482
    (id=1)和
    47228
    (id=2)的行。@GurV求和示例是我能找到的最接近的(仅供参考),我所要求的与此略有不同。(正如我在问题中提到的)是否有任何方法可以只使用MySQL查询来实现我想要的功能?但您还没有解释为什么要这样做。请用这些信息编辑您的问题。这看起来像是一个排气问题,确定所需数量在哪里完全满足。请您以表格或任何方式(理解)显示您的预期输出。@S_sauden感谢您的评论。在第一个fiddle示例中,我希望返回类型为
    85842
    (id=1)的行。从第二个例子fiddle中,我希望返回类型为
    85482
    (id=1)和
    47228
    (id=2)的行。@GurV求和示例是我能找到的最接近的(仅供参考),我所要求的与此略有不同。(正如我在问题中提到的)是否有任何方法可以只使用MySQL查询来实现我想要的功能?但您还没有解释为什么要这样做。请用这些信息编辑您的问题。这看起来像是一个排气问题,确定所需数量在哪里完全满足。谢谢您的回答。我想我在(第一个例子fiddle)和(第二个例子fiddle)中指定了模式和查询(来自我在问题中链接的答案)。你能详细解释一下这些例子吗?@lee请不要参考网络上其他地方的代码。让你的问题独立起来。你知道SQLFiddle已经停机约1年了吗?其他网站死亡或内容丢失。如果您想要一个引用SQL的答案,请将其以纯文本(无图像)的形式发布在问题中,谢谢您的回答。我想我在(第一个例子fiddle)和(第二个例子fiddle)中指定了模式和查询(来自我在问题中链接的答案)。你能详细解释一下这些例子吗?@lee请不要参考网络上其他地方的代码。让你的问题独立起来。你知道SQLFiddle已经停机约1年了吗?其他网站死亡或内容丢失。如果您想要一个引用您的SQL的答案,请将其以纯文本(无图像)的形式发布在您的问题中
    SET @runningTotal=0;
    SELECT
      O.Id,
      O.Type,
      O.MyAmountCol,
      @runningTotal + O.MyAmountCol as 'RunningTotal',
      @runningTotal := @runningTotal + O.MyAmountCol
    
    FROM Table1 O
    HAVING RunningTotal <=15;
    
    1   85482   10  10 (1 Row)
    
    SELECT
      a.Id,
      a.Type,
      a.MyAmountCol
    FROM Table1 a
    LEFT JOIN Table1 b on b.id < a.id
    GROUP BY 1,2,3
    HAVING COALESCE(SUM(b.MyAmountCol), 0) < 15