方法一:
- 查询每个用户获得的总积分
select user_id, sum(grade_num) as gn from grade_info group by user_id
- 使用窗口函数 dense_rank() 按照总积分成绩降序paim
select user_id, gn, dense_rank() over(order by gn desc) as rn from ( select user_id, sum(grade_num) as gn from grade_info group by user_id ) a ) b
- 排名第一的就是积分最高的人,最终代码如下:
select user_id, name, gn from ( select user_id, gn, dense_rank() over(order by gn desc) as rn from ( select user_id, sum(grade_num) as gn from grade_info group by user_id ) a ) b left join user u on b.user_id = u.id where rn = 1 ;
方法二:聚合函数和窗口函数结合
下面这这种方法更简洁。select user_id, name, gn from ( select user_id, sum(grade_num) as gn, dense_rank() over(order by sum(grade_num) desc) as rn from grade_info group by user_id ) a left join user u on a.user_id = u.id where rn = 1 ;