with new_grade_info as (
    select
        user_id,
        case
            when type = 'add' then grade_num
            when type = 'reduce' then (-1 * grade_num)
        end as grade_num
    from 
        grade_info
),

sum_grade_info as (
    select
        user_id,
        sum(grade_num) as grade_num,
        rank() over (order by sum(grade_num) desc) as rn
    from 
        new_grade_info
    group by 
        user_id
)

select
    u.id,
    u.name,
    s_g_i.grade_num
from 
    sum_grade_info as s_g_i
left join 
    user as u
on 
    s_g_i.user_id = u.id
where 
    s_g_i.rn = 1
order by 
    u.id