首页 > 试题广场 >

获得积分最多的人(一)

[编程题]获得积分最多的人(一)
  • 热度指数:80290 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
牛客每天有很多用户刷题,发帖,点赞,点踩等等,这些都会记录相应的积分。
有一个用户表(user),简况如下:
id name
1 tm
2 wwy
3 zk
4 qq
5 lm

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

请你写一个SQL查找积分增加最高的用户的名字,以及他的总积分是多少(此题数据保证积分最高的用户有且只有1个),以上例子查询结果如下:
name grade_num
tm 4
解释:
user_id为1的总计加了4分,其他的都是3分,user_id为1的name为tm
输出tm|4
示例1

输入

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');

输出

tm|4
头像 牛客题解官
发表于 2025-03-21 16:43:02
精华题解 题目描述 我们有两个表: user:包含用户信息,包括用户ID id 和用户名 name。 grade_info:包含积分信息,包括用户ID user_id、积分数量 grade_num 和积分类型 type。 目标是查询出积分增加最高的用户的名字及其总积分。 知识点 窗口函数:使用SUM窗口 展开全文
头像 喏喏喏喏喏喏喏喏喏喏喏喏
发表于 2021-06-17 16:58:37
窗口函数求和 -> 倒序 -> 过滤剩下一行 select name,sum(grade_num)over(partition by user_id) as grade_sum from grade_info,user where grade_info.user_id = user.id 展开全文
头像 高质量搬砖人
发表于 2021-04-03 10:55:52
使用窗口函数sum()over()来解答 虽然但是,我觉得是有点歧义的,他问题应该问成:总积分最高的 而不是 增加积分最高的 select u.name, g.grade from (select user_id, sum(grade_num)over(partition by user_id) 展开全文
头像 取名困难户
发表于 2021-06-14 00:05:51
下面代码是获得积分最多的人(一)(二)(三)的通解,第一题只是将第一行后的a.id去掉就可以了!~思路如下: - 1.求每个用户的总积分 - 2.题意中相同积分需要输出,按总积分采用dense_rank() over()排序,取排名为1即可 SELECT a.id, a.n 展开全文
头像 牛客922864891号
发表于 2022-04-05 14:21:32
利用DENSE_RANK()函数,当积分最多的人不止一个时也可以求解。 SELECT name,grade_num FROM (SELECT name,SUM(grade_num) as grade_num ,DENSE_RANK() OVER (ORDER BY SUM(grade 展开全文
头像 SunburstRun
发表于 2021-03-30 15:25:43
先按user_id分组统计和,如下结果: select user_id,sum(grade_num) as grade_sum from grade_info group by user_id order& 展开全文
头像 山水间边
发表于 2021-08-27 09:33:36
此题数据保证积分最高的用户有且只有1个——此题可以用limit找出,但是并不普适,还需要考虑并列情况!尽量用联...... select b.name, sum(a.grade_num) as grade_sum from grade_info a left join user b on a.u 展开全文
头像 Lion灬Heart
发表于 2021-09-23 17:16:59
# 方法一 select gs.name , max(`grade_sum`) from ( SELECT u.name , SUM(g.grade_num) as `grade_sum` FROM user as u inner join grade_info as g on u.id 展开全文
头像 Ding_123
发表于 2021-12-09 18:47:33
知识点 首先使用窗口函数求和建立一个新表,按照数量降序排序第一个就是所求,之后再连接user表。 代码 select u.name, t.grade_sum from (select user_id, sum(grade_num) over(partition by user_id ) as 展开全文
头像 白色森林
发表于 2025-08-23 10:50:14
SELECT u.name, SUM(g.grade_num) AS grade_num FROM user AS u INNER JOIN grade_info AS g ON u.id=g.user_id GROUP BY u.name ORDER 展开全文
头像 不要拉倒吧
发表于 2022-04-02 21:03:49
select user.name,sum(grade_num) grade_num from user join grade_info on user.id=grade_info.user_id group by user.name order by grade_num desc limit 1