描述

牛客每天有很多用户刷题,发帖,点赞,点踩等等,这些都会记录相应的积分。
有一个用户表(user),简况如下:


还有一个积分表(grade_info),简况如下:
第1行表示,user_id为1的用户积分增加了3分。
第2行表示,user_id为2的用户积分增加了3分。
第3行表示,user_id为1的用户积分又增加了1分。
.......
最后1行表示,user_id为3的用户积分增加了1分。

请你写一个SQL查找积分增加最高的用户的id(可能有多个),名字,以及他的总积分是多少,查询结果按照id升序排序,以上例子查询结果如下:
解释:
user_id为1和3的2个人,积分都为4,都要输出
drop table if exists user;
drop table if exists grade_info;

CREATE TABLE user (
id  int(4) NOT NULL,
name varchar(32) NOT NULL
);

CREATE TABLE grade_info (
user_id  int(4) NOT NULL,
grade_num int(4) NOT NULL,
type varchar(32) NOT NULL
);

INSERT INTO user VALUES
(1,'tm'),
(2,'wwy'),
(3,'zk'),
(4,'qq'),
(5,'lm');

INSERT INTO grade_info VALUES
(1,3,'add'),
(2,3,'add'),
(1,1,'add'),
(3,3,'add'),
(4,3,'add'),
(5,3,'add'),
(3,1,'add'); 


逐渐将条件收窄

WITH total AS 
(SELECT *,
       SUM(grade_num) AS grade_sum
FROM grade_info
GROUP BY user_id
ORDER BY grade_sum
),

rank_table AS 
(SELECT *,
       RANK() OVER (ORDER BY grade_sum DESC) AS rank
FROM total
)

SELECT user.id, user.name, rank_table.grade_sum
FROM user
LEFT JOIN rank_table
 ON user.id = rank_table.user_id
WHERE rank = 1