题解 | #获得积分最多的人(二)#
获得积分最多的人(二)
http://www.nowcoder.com/practice/b6248d075d2d4213948b2e768080dc92
问题:请你写一个SQL查找积分增加最高的用户的id(可能有多个),名字,以及他的总积分是多少,查询结果按照id升序排序
问题拆解:1.对表grade_info按照user_id分组,对字段grade_num求和,并按照求和后降序排序。(这里不能用orderby+limit的方法,因为可能有并列第一名的情况存在)
(SELECT user_id,
SUM(grade_num) s,
RANK() OVER(ORDER BY SUM(grade_num) DESC) r
FROM grade_info
GROUP BY user_id) r1
2.步骤1新生成的表命名为r1,将r1和表user链接,设置r1.user_id=u.id,提取需要字段id, name, sum。
3.在步骤2的基础上设定限定条件,排名为第一名
4.最后常规order by,最后一句orderby不写也是对的,应该是系统默认就是升序排序
SELECT u.id, u.name, s FROM
(SELECT user_id,
SUM(grade_num) s,
RANK() OVER(ORDER BY SUM(grade_num) DESC) r
FROM grade_info
GROUP BY user_id) r1
JOIN user u
ON r1.user_id =u.id
WHERE r=1
ORDER BY u.id