题解 | #获得积分最多的人(三)#
获得积分最多的人(三)
http://www.nowcoder.com/practice/d2b7e2a305a7499fb310dc82a43820e8
- 参考答案
select
u.id,
u.name,
t.grade_sum grade_sum
from user u,(
select user_id,
sum(if(type='add',grade_num,-grade_num)) grade_sum,
dense_rank() over(order by sum(if(type='add',grade_num,-grade_num)) desc) rk
from grade_info gi
group by user_id
) t
where u.id=t.user_id and rk=1
order by u.id
- 本题解析
题中让我们查的数据中,id和name直接从user表中查出来就可以了;
关键是查grade_sum,分数有加有减,所以我们用if判断一下:
sum(if(type='add',grade_num,-grade_num))
积分统计出来了之后,进行排序,利用dense_rank()正好可以帮我们得到rank=1的数据
dense_rank() over(order by sum(if(type='add',grade_num,-grade_num)) desc)