with grade as 
(
  select user_id,sum(grade_change) grade_num
  from (
    select user_id,grade_num
    ,case when type='add' then grade_num else (-1)*grade_num end grade_change
    from grade_info) as t1
  group by user_id
) -- 用户积分表

select id,name,grade_num
from (
  select user.id,name,grade_num
  ,dense_rank()over(order by grade_num desc) posn
  from user
  inner join grade
  on user.id=grade.user_id
) as t2
where posn=1