如何获取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 |
+----+-------+-------------+
- 当每一行都不能满足条件时(即,如果每个值都大于阈值),则不返回任何行。
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)
- 当条件被捕获在中间时(即,如果前两个值是10和20,并且阈值是15),则返回值的总和总是小于或等于阈值。
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行,直到某列的总和超过阈值?的主要内容,如果未能解决你的问题,请参考以下文章