SQL:如何选择行使其总和等于某个值

4

我希望选择行总和达到某个特定数值。

我的 SQL (SQL Fiddle):

id  user_id     storage
1   1           1983349
2   1           42552
3   1           367225
4   1           1357899
37  1           9314493

它应该计算总和达到410000并获取行。同时,它应该得到类似于以下内容:

id  user_id     storage
2   1           42552
3   1           367225

正如你所看到的,42552 + 367225 = 409777。它选择了两行,几乎接近410000。

我尝试了一切但都没有成功 :(

对不起,我的语言是德语。


用PHP实现这很容易。你想要一个仅限于MySQL的解决方案吗? - George Pant
看起来你在StackOverflow上还比较新。如果有答案帮到了你,请务必点赞。如果它解决了你的问题,请将答案标记为已接受。 - Mathias Lykkegaard Lorenzen
@GeorgePant 不,PHP会更好 :) - Crookie Susoku
这似乎是最好用动态规划或回溯法解决的问题。 - apokryfos
我已经尝试了一切,但都没有成功:( 我不确定,真的是一切吗? :D 没关系,请看http://mattgemmell.com/what-have-you-tried/。与其说,每个人都应该展示(代码)已经尝试过什么,而不是告诉别人。 - Sami
问题还不够清楚。所以你想要忽略所有storage>410000的行,并获取所有小于410000的行。不是这样吗?还有其他要求吗?请添加更多的示例数据(更多小于410000的行),然后给出期望的完整结果,这样可能会更清晰一些。 - Sami
2个回答

2

您可以使用相关子查询来获取运行总数,并检索那些运行总数小于指定数字的行。(请注意,我已将存储列更改为int。如果是varchar,则比较将返回错误结果)

select id,user_id,storage
from uploads t
where storage+coalesce((select sum(storage) from uploads 
                        where storage<t.storage),0) < 410000
order by storage

SQL Fiddle

编辑:当存储列中存在重复值时,必须通过包含 id 列的条件来在运行总和中加以考虑。(在本例中使用了 < 条件,因此会选择具有重复存储值的最小 id)

select id,user_id,storage
from uploads t
where storage+coalesce((select sum(storage) from uploads 
                        where storage<t.storage 
                        or (storage=t.storage and id < t.id)),0) < 410000
order by storage

在这种情况下,您需要选择具有相等值的那一行。对user_id进行分组并存储。然而,在其他情况下,这可能会成为一个问题..我会解决它。 - Vamsi Prabhala
查看已编辑版本,该版本不需要“group by”。 - Vamsi Prabhala

1
这是您所需要的:

SET @suma = 0;
SELECT @suma:=@suma+`storage`, id, storage FROM table 
WHERE @suma<=410000 
ORDER BY storage ASC;

我在语句中添加了“ORDER BY storage ASC”以跳过存储过多的行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接