type='add'时,直接进行 sum() 求和,可是当 type='reduce' 时,需要减掉,相当于乘以 -1,
上述场景,可以通过 case when ... then ... else ... end 实现。

select user_id, name, gn
from (
    select user_id, gn,
        dense_rank() over(order by gn desc) as rn
    from (
        select 
            user_id,
            sum(case when type='add' then grade_num else grade_num * (-1) end) as gn
        from grade_info
        group by user_id
    ) a
) b
left join user u 
on b.user_id = u.id
where rn = 1
;