首页 > 试题广场 >

获得积分最多的人(二)

[编程题]获得积分最多的人(二)
  • 热度指数:68583 时间限制: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 
select id,name,s as grade_num
from
(select ur.id,ur.name,go.s,dense_rank() over(order by s desc) as d
from
(select user_id,sum(grade_num) as s
from grade_info
where type='add'
group by user_id) as go
join user as ur
on ur.id=go.user_id) as e
where d=1
发表于 2022-03-14 11:28:45 回复(0)
select a.id,a.name,b.grade_sum
from user as a join (
    select user_id,grade_sum,rank() over(order by grade_sum desc) as flag
    from (
        select user_id,sum(grade_num) as grade_sum
        from grade_info
        group by user_id)/* 计算每个用户增加的积分*/
    ) as b/*将用户的积分排名*/
on a.id=b.user_id and  b.flag=1/*匹积分最高的用户信息*/
order by a.id;
发表于 2021-06-20 21:47:09 回复(0)
# 编译环境:mysql
# 解题思路:
# 1)按照user_id,对grade_num求和;
# 2)对上一步求和进行排序(倒序);
# 3)找到排序最大的就是题目需要的。
select distinct user_id as id,name,sums as grade_sum
from 
(select *,dense_rank() over (order by sums desc) as ranking
from 
(select user_id,b.name,sum(grade_num) over (partition by user_id) as sums
from grade_info as a
left join user as b
on a.user_id=b.id and a.type='add') as c) as t
where t.ranking=1
order by user_id;

发表于 2021-06-12 12:12:08 回复(3)
WITH t AS (
    SELECT  user_id,SUM(grade_num) AS grade_sum
    FROM grade_info
    GROUP BY user_id )
SELECT id,name,grade_sum
FROM t
JOIN user u ON u.id = t.user_id
WHERE grade_sum  = (SELECT MAX(grade_sum) FROM t)
使用WITH  ……AS……可以使语句更美观,减少语句的套娃
编辑于 2021-03-30 22:59:17 回复(8)
使用limit确定最高分
select u.id,u.name,sum(g.grade_num) grade_sum
from user u 
join grade_info g
on u.id=g.user_id
group by u.id
having grade_sum = (select sum(grade_num) r 
                    from grade_info g1 
                    group by user_id 
                    order by r desc 
                    limit 1)


发表于 2021-08-22 21:19:31 回复(11)
查2次表即可,感觉比较简单的写法
select
    u.id,u.name,tmp.num
from
    (select
        *,sum(grade_num) as num, dense_rank() over(order by sum(grade_num) DESC) as r
    from
        grade_info
    group by
        user_id) tmp,
    user u
where
    tmp.r=1
and
    u.id=tmp.user_id
order by
    u.id


发表于 2021-07-07 09:55:53 回复(0)
大家是不是忘了还有一个ALL关键字啦
select b.id,b.name,sum(grade_num) from grade_info a join user b on a.user_id=b.id
group by b.id,b.name
having sum(grade_num)>=
ALL(select sum(grade_num) from grade_info group by user_id)


发表于 2022-01-26 14:53:11 回复(1)
先找出按照user_id累计积分:
(select *,sum(grade_num)as maxes 
from grade_info group by user_id order by maxes desc)a
再用窗口函数对累计积分maxes进行排序:
(select *,rank() over (order by maxes desc) ranking from
(select *,sum(grade_num)as maxes 
from grade_info group by user_id order by maxes desc)a)aa
选出最高积分的,即ranking=1:
(select * from(
select *,rank() over (order by maxes desc) ranking from
(select *,sum(grade_num)as maxes 
from grade_info group by user_id order by maxes desc)a)aa
where aa.ranking=1)t
再将user表和t表连接
select b.id,b.name,t.maxes from
(select * from(
select *,rank() over (order by maxes desc) ranking from
(select *,sum(grade_num)as maxes 
from grade_info group by user_id order by maxes desc)a)aa
where aa.ranking=1)t
inner join user b
on b.id=t.user_id






发表于 2021-04-17 20:20:26 回复(1)
做法一 select
    u.id as id,
    u.name as name,
    tmp.cn as grade_sum
from(select
         user_id,
         sum(grade_num) as cn,
         rank() over(order by sum(grade_num) desc) as r
     from grade_info g
     group by g.user_id
     )tmp
join user u on tmp.user_id=u.id
where tmp.r=1
order by 1
做法二
select
    u.id as id,
    u.name as name,
    tmp1.cn as grade_sum
from(select
        tmp.*,
        rank() over(order by tmp.cn desc) as r
    from(select
            user_id,
            sum(grade_num) as cn
        from grade_info g
        group by g.user_id
        )tmp
    )tmp1
join user u on tmp1.user_id=u.id
where tmp1.r=1
order by 1
做法三
select     u.id as id,     u.name as name,     sum(grade_num) as grade_sum from grade_info g join user u on g.user_id=u.id group by u.id having(sum(grade_num)>= all(select sum(grade_num) from grade_info group by user_id))

编辑于 2021-04-28 22:13:30 回复(1)
SELECT u.id, u.name, g.grade_sum
FROM user u,(
    select user_id, sum(grade_num) grade_sum,
    dense_rank() over (order by sum(grade_num) desc) rk
    from grade_info
    where type='add'
    group by user_id) g
WHERE u.id=g.user_id and g.rk=1;

发表于 2021-10-17 22:52:22 回复(0)
什么狗屁题目……“积分增加最高”我还以为是单词加分最多……直说“所有增加分数之和”不就好了……
发表于 2022-08-12 13:49:38 回复(0)
select user_id,name,grade_sum
from(
select user_id,sum(grade_num) grade_sum,rank() over(order by sum(grade_num) desc) rk
from grade_info
where type="add"
group by user_id
)t1 join user 
on user.id=user_id
where rk=1
order by user_id

发表于 2022-03-05 11:20:30 回复(0)
with as 太香了。  上边是自己写的嵌套,下边抄高赞答案美化
## 子查询嵌套
select id, name, grade_sum
from (
    select user_id, sum(grade_num) grade_sum
    from grade_info
    group by user_id
)T
join user T2 on T2.id = T.user_id
where grade_sum = (
    select max(grade_sum) 
    from (
        select user_id, sum(grade_num) grade_sum
        from grade_info
        group by user_id
    ) A
)

## with as 美化
with T as (
    select user_id, sum(grade_num) grade_sum
    from grade_info
    group by user_id
)
select id, name, grade_sum
from T
join user T2 on T2.id = T.user_id
where grade_sum = (select max(grade_sum) from T)


发表于 2021-04-11 12:39:05 回复(2)
with gp as (
SELECT user_id,sum(grade_num) as grade_sum from grade_info group by user_id
)
  

select id,name,sums from (
    select
        gp.user_id as id,
        user.name as name,
        gp.grade_sum as sums,
        rank() over(order by gp.grade_sum desc) as t_rank
    from
        gp
    left join user on gp.user_id=user.id order by sums DESC
) as t where t.t_rank=1;

发表于 2021-10-21 10:23:54 回复(0)
select i,n,s 
from (select *,rank()over(order by s desc) r 
     from(select distinct id i,name n
         ,sum(grade_num)over(partition by user_id) s
         from grade_info g join user u on g.user_id=u.id)a)b 
where r=1 
order by 1;

发表于 2024-08-07 23:10:31 回复(0)
分别给出总分情况与最高分,存储在临时表中再通过主查询给出等于最高分的用户信息
with a as(-- 获取每个人的总积分情况
SELECT
    t1.user_id,
    t2.name,
    sum(grade_num) over(PARTITION BY t1.user_id) as total_score
FROM
    grade_info t1
    join user t2  on t1.user_id=t2.id
ORDER by t1.user_id asc),
b as( -- 给出最高分
select 
    sum(grade_num)  as grade_num
FROM
    grade_info
GROUP BY user_id
ORDER BY grade_num DESC
limit 1)

SELECT
    DISTINCT a.user_id as id,
    a.name,
    a.total_score as grade_num
FROM
    a
    inner join b 
    on a.total_score = b.grade_num
ORDER BY 
    a.user_id ASC


发表于 2024-07-10 15:59:00 回复(0)
select user.id
,user.name
,rt3.sum_grade
from
(
    select rt2.user_id user_id
    ,rt2.sum_grade sum_grade
    from
    (
        select rt1.user_id user_id
        ,rt1.sum_grade sum_grade
        ,dense_rank()over(order by sum_grade desc) rk
        from
        (
            select user_id
            ,sum(grade_num)over(partition by user_id order by grade_num desc) sum_grade
            from grade_info
        ) rt1
    ) rt2
    where rt2.rk=1
) rt3 join user on rt3.user_id=user.id

发表于 2024-05-19 01:29:16 回复(0)
select id,name,grade_num 
from
(select id,name,sum(grade_num) grade_num,
dense_rank()over(order by sum(grade_num) desc) rk
from user u
join
grade_info g
on u.id=g.user_id
where type='add'
group by id,name
)t
where rk=1
order by id;

编辑于 2024-04-12 10:31:29 回复(0)
 with t as (select user_id,sum(grade_num) grade_sum
from grade_info 
group by user_id) 
select id,name,grade_sum grade_num 
from t join user 
on t.user_id=user.id
where grade_sum=(select max(grade_sum) from t)
order by 1 

发表于 2023-10-26 18:40:45 回复(0)
with t as
(select user_id,
sum(grade_num) as grade_sum,
dense_rank() over(order by sum(grade_num) desc) as rk
from grade_info
group by user_id)

select u.id,u.name,t.grade_sum as grade_num
from t
join user u on t.user_id = u.id
where t.rk = 1
order by u.id

汇总再排序,利用sum()跟rank()窗口函数
发表于 2022-10-27 15:34:34 回复(0)