利用rank() over()求解
- 在最内层的a表中,用case when处理好加减法的情况,把用户的总积分算出来。出现'type=reduce'的情况就等于0-grade_num,把积分转换成负数。
- 在第中间层的b表中利用rank() over()对a表已经算好的积分进行降序排序。
- 将user表与排序好的b表进行表连接。
- 限定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