首页 > 试题广场 >

获得积分最多的人(二)

[编程题]获得积分最多的人(二)
  • 热度指数:68760 时间限制: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 
with t as (
select b.id,b.name ,sum(a.grade_num)over (partition by a.user_id) as grade_num
from grade_info a
left join user b
on a.user_id=b.id
where type='add'
)

select distinct id, name, grade_num
from(
select id, name, grade_num,
rank()over(order by grade_num desc) as rk
from t
)c
where rk=1
order by id
发表于 2025-04-09 00:59:01 回复(0)
select
user_id,name,s
from
(
 select user_id
,name
,rank()over(order by s desc) r
,s
from
(
select user_id
,name
,sum(grade_num) s
from grade_info gi left join user u
on gi.user_id=u.id
group by gi.user_id,u.name
order by s desc
) zi
) zi2
where zi2.r=1
发表于 2025-02-06 18:50:27 回复(0)
#L查找积分增加最高的用户的id(可能有多个),名字,以及他的总积分是多少,查询结果按照id升序排序

select b.id,b.name,a.grade_num from
(select user_id,sum(grade_num) grade_num,dense_rank() over(order by sum(grade_num) desc) pm from grade_info
where type='add'
group by user_id
) a inner join user b
on a.user_id=b.id
where a.pm=1
发表于 2024-12-06 11:13:14 回复(0)
select id,name,grade_num
from
    (select id,name
    ,sum(grade_num) grade_num
    ,dense_rank() over (order by sum(grade_num) desc) rnk
    from grade_info g
    join user u
    on g.user_id=u.id
    group by 1,2) t
where rnk=1
order by id 

发表于 2024-11-11 00:47:52 回复(0)
select l.id,l.name,l.g1
from
(
    select u1.id,t.name,t.grade_num1 as g1,
    dense_rank() over(order by grade_num1 desc) as t_rank
    from
    (
        select name,sum(grade_num) as grade_num1
        from grade_info g left join user u
        on g.user_id=u.id
        where type='add'
        group by name
    )t
    left join user u1
    on t.name=u1.name
)l
where l.t_rank=1
order by l.id

发表于 2024-10-23 10:28:53 回复(0)

根据最大值找对应的数据

select *
from (
    select t1.user_id, t2.name, sum(t1.grade_num) as num
    from grade_info t1
    left join user t2 on t1.user_id = t2.id
    group by t1.user_id, t2.name
) t
where num = (
    select max(num)
    from (
        select user_id, sum(grade_num) as num 
        from grade_info
        group by user_id
    ) t
)
order by user_id asc

也可以先求和,然后排序,相同内容有同样序号的可以使用 dense_rank() 窗口函数

select user_id, name, num
from (
    select t1.user_id, t2.name, sum(t1.grade_num) as num
    , dense_rank() over(order by sum(t1.grade_num) desc) as rn
    from grade_info t1
    left join user t2 on t1.user_id = t2.id
    group by t1.user_id, t2.name
    order by sum(t1.grade_num)
) t
where rn = 1
发表于 2024-08-15 11:18:51 回复(0)
select id, name, grade_num
from
(
select *, dense_rank() over(order by grade_num desc) as grade_rank
from
(
select id, name, grade_num
from user as t1
left join
(
select user_id, sum(grade_num) as grade_num 
from grade_info
group by user_id
order by user_id
) as t2
on t1.id=t2.user_id
) as t3
) as t4
where grade_rank=1;

发表于 2024-07-30 00:24:06 回复(0)
with a as(
    select
        *,
        sum(grade_num) over(partition by user_id) as total_sum
    from
        grade_info
)


select distinct
    a.user_id,
    u.name,
    a.total_sum as grade_num
from    
    a
left join
    user as u
on
    a.user_id = u.id
where
    a.total_sum = (select max(total_sum) from a)
order by
    a.user_id
发表于 2024-07-18 19:07:27 回复(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
    distinct u.id,
    u.name,
    t2.grade_total grade_num
from user u join (
    select 
        *,
        dense_rank() over (order by grade_total desc) rk
    from
    (
        select
            user_id,
            sum(grade_num) over (partition by user_id) grade_total
        from grade_info
        where type='add'
    ) t1
) t2
on u.id=t2.user_id
where t2.rk=1
发表于 2024-06-10 14:07:23 回复(0)
SELECT
    u.id,
    u.name,
    g3.sum_grade AS grade_num
FROM(
    SELECT
        user_id,
        sum_grade,
        DENSE_RANK()OVER(ORDER BY sum_grade DESC ) AS rk_grade
    FROM(
        SELECT
            user_id,
            sum(grade_num) AS sum_grade
        FROM grade_info
        GROUP BY user_id
    ) AS g2
    GROUP BY user_id, sum_grade
) AS g3
LEFT JOIN user u
    ON u.id = g3.user_id
WHERE g3.rk_grade = 1
ORDER BY u.id;

发表于 2024-05-09 12:06:35 回复(0)
SELECT
    a.id,
    a.name,
    b.total_grade AS grade_num
FROM user AS a
INNER JOIN (
    SELECT
        user_id,
        SUM(grade_num) AS total_grade,
        DENSE_RANK() OVER (ORDER BY SUM(grade_num) DESC) AS ranking
    FROM grade_info
    GROUP BY user_id
) AS b ON a.id = b.user_id
WHERE b.ranking = 1;

发表于 2024-05-06 13:34:37 回复(0)
使用临时表之后代码好像确实整洁了不少
with t as (
    SELECT user_id,sum(grade_num) as grade_sum 
    from grade_info 
    group by user_id
)

select u.id,u.name,t.grade_sum as grade_num
from t
left join user u on t.user_id = u.id
where t.grade_sum = (
    select max(t.grade_sum)
    from t
)


编辑于 2024-04-25 15:18:05 回复(0)
select
    u.id,
    u.name,
    a.score
from
    user u
    left join (
        select
            user_id,
            sum(grade_num) 'score',
            dense_rank() over (
                order by
                    sum(grade_num) desc
            ) 'num'
        from
            grade_info g
        group by
            user_id
    ) a on u.id = a.user_id
where
    a.num = 1
order by
    u.id;
-- 楞解就完了

发表于 2024-03-27 17:04:58 回复(0)
考察开窗函数
rank row_number dense_rank


-- 允许并列的开窗函数是 dense_rank或者rank
select
    id,
    name,
    grade_num
from
    (
    select
        id,
        name,
        grade_num,
        rank() over(order by grade_num desc) as rk
    from
    (
    select
        gi.user_id as id,
        u.name,
        sum(grade_num) as grade_num
    from grade_info gi
    left join user u 
    on gi.user_id = u.id
    and gi.type = 'add'
    group by gi.user_id,u.name
    ) t0
    ) t1 
where rk = 1
order by id asc


发表于 2023-11-27 23:10:05 回复(2)
# 请你写一个SQL查找积分增加最高的用户的id(可能有多个),名字,以及他的总积分是多少,查询结果按照id升序排序
-- 本题注意结果去重复,否则数据不对;

with dwd_data as (
select 
user_id,
sum(grade_num) over(partition by user_id) as grade_num
from grade_info where type= 'add'
)

select id,name,grade_num
from 
(
select 
t2.id,
t2.name,
grade_num,
rank()over(order by grade_num desc) rk 
from dwd_data t1 
inner join user t2 on t1.user_id = t2.id
) tt 
where tt.rk =1
group by id,name,grade_num
order by 1;


发表于 2023-10-20 17:49:39 回复(0)
with tmp as (select u.id,u.name,
            sum(g.grade_num) over (partition by u.id) ttl
            from user u 
            inner join grade_info g 
            on u.id= g.user_id
            order by ttl desc
) 

select 
    distinct id,
    name,
    ttl
from tmp 
where ttl = (select max(ttl) from tmp);

发表于 2023-06-19 16:39:57 回复(0)
select id,name,sum(grade_num) gn
from grade_info gi left join user u
on gi.user_id=u.id
group by id,name
having gn=(select sum(grade_num) as grade_sum
                  from grade_info
                  group by user_id
                  order by grade_sum desc
                  limit 1)
order by gn desc,id;

发表于 2023-03-20 15:47:40 回复(0)
方法一:
select id, name, grade_sum as grade_num
from 
(
    select user_id
        , sum(grade_num) as grade_sum
        , max(sum(grade_num))over() as grade_max
    from grade_info
    group by user_id
) as t
join user u on t.user_id = u.id
where grade_sum = grade_max
order by id;
方法二:
select id, name, grade_sum as grade_num
from
(
    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
) as t
join user u on t.user_id = u.id
where rk = 1
order by id;
方法三:
with t as
(
    select user_id
        , sum(grade_num) as grade_num
    from grade_info
    group by user_id
)

select id, name, grade_num
from t join user u on t.user_id = u.id
where grade_num = (select max(grade_num) from t)
order by id;
发表于 2023-02-28 21:35:26 回复(0)