题解 | #获得积分最多的人(三)#
获得积分最多的人(三)
http://www.nowcoder.com/practice/d2b7e2a305a7499fb310dc82a43820e8
总体思路:
1.根据user_id,分组求其总grade_num
2.对grade_num排名,并取排名为1的记录信息
3.join on 'user'表,得到完整信息
代码:
select u.id,
u.name,
t1.grade
from
(select t.user_id,
t.grade,
dense_rank()over(order by t.grade desc) as r_number
from
(select user_id,
sum(case type when 'add' then grade_num else grade_num*(-1) end) as grade
#可改写为sum(case type when 'add' then grade_num else grade_num*(-1)
end)over(partition by user_id) 则,该句后面“group by user_id”可省略。
from grade_info
group by user_id
) t #该子循环主要是以user_id分组,求其grade_num和。其中用case when函数控制type中的正负,并嵌套sum()函数求和
) t1 #该子循环主要是针对上一子循环求出的grade_num做排序,并取排序为1的记录信息。其中用到dense_rank()函数对t.grade值从大到小进行排序
join user u
on t1.user_id = u.id
where t1.r_number = 1
order by u.id asc