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