首页 > 试题广场 >

获得积分最多的人(一)

[编程题]获得积分最多的人(一)
  • 热度指数:75436 时间限制: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
如果积分最多的不止一个,怎样写比较高效?
发表于 2023-06-30 14:55:05 回复(0)
select b.name,max(cnt)from
(select user_id,
sum(grade_num)over(partition by user_id) as cnt
from grade_info)a 
inner join user b 
on b.id=a.user_id
通过了但是怀疑自己写错了
发表于 2022-03-18 19:53:14 回复(0)
SELECT
    u1.name,
    gi.summing
FROM
    (
        SELECT
            user_id,
            sum(grade_num) AS summing
        FROM
            grade_info
        WHERE
            TYPE = 'add'
        GROUP BY
            user_id
    ) AS gi
    INNER JOIN user AS u1 ON u1.id = gi.user_id
ORDER BY
    summing DESC
LIMIT
    1;

发表于 2022-01-11 14:20:43 回复(0)
with t as (select user_id,sum(grade_num) as grade_num from grade_info where type='add' group by 1)
select 
 a.name,b.grade_num
from user a ,t b
where  a.id=b.user_id
and b.grade_num in (select max(grade_num) from t )
group by 1,2

发表于 2021-12-07 11:26:31 回复(0)


SELECT u.name, SUM(grade_num) AS grade_sum
FROM grade_info g
    LEFT JOIN USER u ON g.user_id=u.id
GROUP BY user_id
ORDER BY grade_sum DESC
LIMIT 1


发表于 2021-10-05 17:35:24 回复(0)
select name,sum(grade_num) as grade_sum
from user u left join grade_info g on u.id = g.user_id
group by name
order by grade_sum DESC
limit 0,1

发表于 2021-09-13 18:18:25 回复(0)
SELECT name,grade_sum
from (SELECT user_id,sum(grade_num)as grade_sum,dense_rank() over(order by sum(grade_num) desc)as n
     from grade_info
     group by user_id)g
JOIN user u ON u.id=g.user_id
WHERE n=1
这样不需要用到limit,而且比较好理解
发表于 2021-08-20 10:00:08 回复(0)