LIMIT(3) 行的 MySQL SUM 与 GROUP BY

标签 mysql group-by sum having

好人,需要一点 MySQL 的帮助。在网上尝试了一些解决方案,但都可以解决问题。

我有这个简单的表格。

name    amount
john  | 150
john  | 100
john  | 100
john  | 150
jack  | 300
jack  | 100
jack  | 100

基本上,我必须在至少 3 行(按最高金额排序)中获取总和为 500 的用户。 正确答案应该只返回 jack 因为只有他在 3 条记录中的总和为 500(按最高排序)。如果 john 的总和为 500,他的最高金额中的 3 个只会返回 400(150+150+100),因此查询不会返回 john

SELECT 
*,
SUM(amount) as sums
FROM (SELECT * FROM transfer GROUP BY name ORDER BY amount DESC LIMIT 3) as ttl
GROUP BY name
HAVING sums >= 500

它工作正常(至少没有错误),但第二个选择(括号内的那个)只返回第一行。

非常感谢任何帮助。

最佳答案

让我假设您有另一列是唯一 ID。然后你可以这样做:

select distinct t1.name
from transfer t1 left join
     transfer t2
     on t1.name = t2.name and t1.id < t2.id left join
     transfer t3
     on t1.name = t3.name and t2.id < t3.id
where t1.amount + coalesce(t2.amount, 0) + coalesce(t3.amount, 0) >= 500;

对于较大的表,这不是非常有效。为此,使用变量来枚举值:

select name
from (select t.*,
             (@rn := if(@n = name, @rn + 1,
                        if(@n := name, 1, 1)
                       )
             ) as rn
      from transfer cross join
           (select @n := '', @rn := 0) params
      order by name, amount desc
     ) t
where rn <= 3
group by name
having sum(amount) >= 500;

这还有一个好处,即它不依赖于 id 列。

关于LIMIT(3) 行的 MySQL SUM 与 GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39705184/

相关文章:

mysql 没有默认值

php - 简单查询问题,where子句

mysql多group_concat顺序保存

php - 从 php/sql 中的多个价格中获取总价

sql - 根据标准 SQL Server 将单列求和为多列

php - Mysql内连接where值在另一个表中

postgresql - 对每 N 个值进行分组

python - Pandas 系列的部分总和

mysql - SQL:包含 where 子句的计数语句的总和

mysql - LAMP/WAMP/MAMP 中 MYSQL(Binary) 和 MySql 的区别