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

问题描述 投票:0回答:1

我一直在搜索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(查询),或者我应该在应用程序级别解决这个问题?

mysql sum subquery
1个回答
1
投票

在较小的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,我们希望保留(始终),没有要加入的行。

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

© www.soinside.com 2019 - 2024. All rights reserved.