利用rank() over()求解

  1. 在最内层的a表中,用case when处理好加减法的情况,把用户的总积分算出来。出现'type=reduce'的情况就等于0-grade_num,把积分转换成负数。
  2. 在第中间层的b表中利用rank() over()对a表已经算好的积分进行降序排序。
  3. 将user表与排序好的b表进行表连接。
  4. 限定b表的排序为1的用户,并使用id进行降序排序。
select u.id
       ,u.name
       , b.grade_num
from user u join 
    (select a.user_id
         ,a.grade_num
         ,rank() over(order by a.grade_num desc) t_rank
     from (
           select gi.user_id
           ,sum(case when gi.type='add' then grade_num 
                          else 0-grade_num end) as grade_num
           from grade_info gi
           group by gi.user_id
          ) a
    ) b
    on u.id=b.user_id
where b.t_rank=1
order by u.id