首页 > 试题广场 >

获得积分最多的人(二)

[编程题]获得积分最多的人(二)
  • 热度指数:70400 时间限制: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
3 1 add
第1行表示,user_id为1的用户积分增加了3分。
第2行表示,user_id为2的用户积分增加了3分。
第3行表示,user_id为1的用户积分又增加了1分。
.......
最后1行表示,user_id为3的用户积分增加了1分。

请你写一个SQL查找积分增加最高的用户的id(可能有多个),名字,以及他的总积分是多少,查询结果按照id升序排序,以上例子查询结果如下:
id name grade_num
1 tm 4
3 zk 4
解释:
user_id为1和3的2个人,积分都为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'),
(3,1,'add'); 

输出

1|tm|4
3|zk|4 
头像 牛客题解官
发表于 2025-03-21 18:22:47
精华题解 题目描述 我们有两个表: user:包含用户信息,包括用户ID id 和用户名 name。 grade_info:包含积分信息,包括用户ID user_id、积分数量 grade_num 和积分类型 type。 目标是查询出积分增加最高的用户的ID、名字及其总积分,并按用户ID升序排列。 知识点 展开全文
头像 失败的cc
发表于 2021-04-06 12:53:02
with tmp_table as ( select t1.id, t1.name, sum(t2.grade_num) as grade_sum from user as t1 join grade_info as t2 on t1.id = t2.user_id 展开全文
头像 高质量搬砖人
发表于 2021-04-03 11:07:10
使用排序函数rank()over()嵌套sum()over()解决 select u.id, u.name , a.grade from (select user_id , g.grade , rank()over(order by g.grade desc) r_number from (sele 展开全文
头像 SunburstRun
发表于 2021-03-30 15:35:53
通过(一) https://blog.nowcoder.net/n/7c15d10512504761a24e72f4f853b768 我们能知道最多的人只有1个的时候怎么写,当有多个的时候,那么我们先获取这个最大值,比如4,4,3,3,3,先获得4是最大值,那么再获得所有的,其中等 展开全文
头像 小狮子跑啊跑
发表于 2021-08-08 14:18:41
使用rank()over()和sum()内嵌定位并列第一的用户 select u.id,u.name,t.grade_sum from (select user_id, sum(grade_num) as grade_sum, rank()over 展开全文
头像 广东菜心
发表于 2021-10-18 15:15:19
和第一题一样,建一个group by user的加好积分的临时积分表。 同时利用rank() over()直接对聚合函数sum(grade_num)进行排序。 将这个临时积分表与user表连接之后,取排名为1即可。 select u.id,u.name,t.grade_num from user 展开全文
头像 视星等无穷
发表于 2022-04-01 20:25:51
1.将grade_info表按照用户分数求和 select user_id,sum(grade_num) grades from grade_info group by user_id; t2 2.与user表关联 select id,name,grades from t2 join user 展开全文
头像 Mr_jin
发表于 2021-06-25 18:54:03
本题在聚合的基础上需要得出最大值,进行判断。我第一思路是:在where或者having子句中得出最大值,然而此版本的MySQL不支持在子句中写(limit)。因此,创建临时表,然后再查询的时候判断: with a as( select u.id,u.name, sum(g.grade_num)ove 展开全文
头像 皮蛋瘦瘦粥
发表于 2023-05-16 09:44:13
select u.id,u.name,g.grade_num from user u join (select user_id,sum(grade_num) as grade_num,dense_rank()over(order by sum(grade_num) desc ) as g_rank 展开全文
头像 jiang_dr
发表于 2021-11-29 09:31:38
方法一: 与第一题类似,但是需要构建一个新的同样的查询语句,使用having过滤,在过滤条件中取出最高的积分 select u.id, u.name, sum(g.grade_num) as grade_sum from user u join grade_info g on u.id = g.us 展开全文
头像 克里克油
发表于 2022-01-18 17:31:52
WITH ss AS (SELECT SUM(IF(type = 'add', grade_num, -grade_num)) OVER ( PARTITION BY u 展开全文