具有GROUP BY的LIMIT(3)行的MySQL SUM

时间:2016-09-26 14:11:24

标签: 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

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我假设您有另一个唯一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列。