总体思路:
1.根据user_id,分组求其总grade_num
2.对grade_num排名,并取排名为1的记录信息
3.join on 'user'表,得到完整信息

代码:

select u.id,
       u.name,
       t1.grade
from
(select t.user_id,
       t.grade,
       dense_rank()over(order by t.grade desc) as r_number
from
    (select user_id,
           sum(case type when 'add' then grade_num else grade_num*(-1) end) as grade

           #可改写为sum(case type when 'add' then grade_num else grade_num*(-1)         
            end)over(partition by user_id) 则,该句后面“group by user_id”可省略。

from grade_info
    group by user_id
    ) t #该子循环主要是以user_id分组,求其grade_num和。其中用case when函数控制type中的正负,并嵌套sum()函数求和
) t1 #该子循环主要是针对上一子循环求出的grade_num做排序,并取排序为1的记录信息。其中用到dense_rank()函数对t.grade值从大到小进行排序
join user u
on t1.user_id = u.id
where t1.r_number = 1
order by u.id asc