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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取MySQL行,直到某列的总和超过阈值?相关的知识,希望对你有一定的参考价值。

我一直在搜索StackOverflow,我发现的最接近的是to use custom variable inside subquery。但建议的解决方案有两个缺点。

Table

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

  1. 当每一行都不能满足条件时(即,如果每个值都大于阈值),则不返回任何行。

Example Fiddle

Query
SET @runningTotal=0;
SELECT
  O.Id,
  O.Type,
  O.MyAmountCol,
  @runningTotal + O.MyAmountCol as 'RunningTotal',
  @runningTotal := @runningTotal + O.MyAmountCol

FROM Table1 O
HAVING RunningTotal <=5;
Returned
0 Row(s)
  1. 当条件被捕获在中间时(即,如果前两个值是10和20,并且阈值是15),则返回值的总和总是小于或等于阈值。

Example Fiddle

Query
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;
Returned
1   85482   10  10 (1 Row)

期望的结果是这样的。在第一个例子中,我希望返回第一行(id = 1,type = 85842)。在第二个例子中,我想要的是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

添加COALESCE()调用以满足最低ID,我们希望保留(始终),没有要加入的行。

免责声明:代码可能无法编译或工作,因为它在我的手机上翻阅(但它有合理的可能性)

以上是关于如何获取MySQL行,直到某列的总和超过阈值?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的聚合函数

MySQL 聚合函数 和 分组查询(初级)

MySQL 聚合函数 和 分组查询(初级)

MySQL 聚合函数 和 分组查询(初级)

如何获取GridView中某行某列的值

DevExpress GridView获取选中行某列的值