题解 | #获得积分最多的人(二)#
获得积分最多的人(二)
http://www.nowcoder.com/practice/b6248d075d2d4213948b2e768080dc92
本题思路,首先根据积分表求出各个用户的积分总和,并将用户id、各用户积分和新建为表t1,再在表t1的基础上,对各用户的积分按降序排列,并将排序字段同用户id、各用户积分和字段组成新表t2;
最后,使用user表同t2表进行表连接,筛选出排名为第一的用户信息,并按用户id升序排列。
select u.id,u.name,t2.s from user u
right join # 将user表同t2表进行连接
(select ui,s,rank()over(order by s desc) rk from
(select distinct user_id ui,sum(grade_num)over(partition by user_id) s from grade_info) t1) t2 # 首先,从表grade_info中筛选出用户id、以及各用户的总积分作为表t1;其次,在表t1的基础上对用户的总积分按降序排列,将得到的用户id、各用户的总积分以及排序字段作为表t2
on u.id = t2.ui
where t2.rk = 1 # 筛选积分总和为第一的用户
order by u.id # 按用户id升序排列