首页 > 试题广场 >

最差是第几名(一)

[编程题]最差是第几名(一)
  • 热度指数:41751 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
TM小哥和FH小妹在牛客大学若干年后成立了牛客SQL班,班的每个人的综合成绩用A,B,C,D,E表示,90分以上都是A,80~90分都是B,70~80分为C,60~70为D,E为60分以下
假设每个名次最多1个人,比如有2个A,那么必定有1个A是第1名,有1个A是第2名(综合成绩同分也会按照某一门的成绩分先后)。
每次SQL考试完之后,老师会将班级成绩表展示给同学看。
现在有班级成绩表(class_grade)如下:
grade number
A 2
D 1
C 2
B 2
第1行表示成绩为A的学生有2个
.......
最后1行表示成绩为B的学生有2个

请你写出一个SQL查询,如果一个学生知道了自己综合成绩以后,最差是排第几名? 结果按照grade升序排序,以上例子查询如下:
grade
t_rank
A 2
B 4
C 6
D 7
解析:
第1行表示,学生成绩为A的知道自己最差为第2名
第2行表示,学生成绩为B的知道自己最差为第4名
第3行表示,学生成绩为C的知道自己最差为第6名
第4行表示,学生成绩为D的知道自己最差为第7名


示例1

输入

drop table if exists class_grade;
CREATE TABLE class_grade (
grade varchar(32) NOT NULL,
number int(4) NOT NULL
);

INSERT INTO class_grade VALUES
('A',2),
('D',1),
('C',2),
('B',2);

输出

A|2
B|4
C|6
D|7
select grade, sum(number) over(order by grade) t_rank
from class_grade
order by grade;
发表于 2025-07-01 16:19:11 回复(0)
select grade ,sum(number) over(order by grade) t_rank from class_grade;

发表于 2025-01-09 18:02:56 回复(0)
select grade,
       sum(number) over(order by grade ) as number
from class_grade
order by grade 
根据等级,做一个累计和
发表于 2024-10-22 20:06:25 回复(0)

主要是考虑对窗口函数的理解,加partition by和不加partition by的计算逻辑要搞清楚
不加partition by的情况下,是会累加计算的

select grade, sum(number) over(order by grade) as rn
from class_grade
发表于 2024-08-14 17:42:57 回复(0)
select grade, 
sum(number) over(order by grade) as t_tank
from class_grade
order by grade;

发表于 2024-07-29 21:32:43 回复(0)

又学到了窗口函数。

select
    grade,
    sum(number) over (order by grade asc) t_rank
from class_grade;
发表于 2024-06-05 20:53:28 回复(0)
SELECT
    grade,
    sum(number)OVER(ORDER BY grade) AS t_rank
FROM class_grade
GROUP BY grade, number
ORDER BY grade;

编辑于 2024-04-24 11:42:39 回复(0)
select grade,sum(number) over(order by grade
                         rows between unbounded preceding and current row)as t_rank
from class_grade;
窗口函数 杠杠的
发表于 2024-04-19 16:18:04 回复(0)
select grade,(select sum(number) t_rank from class_grade 
where ascii(grade)<=ascii(a.grade)) from class_grade a
order by grade;

发表于 2024-02-07 11:07:01 回复(0)
select c1.grade, sum(c2.number) as t_rank
from class_grade c1
inner join class_grade c2 on c1.grade >= c2.grade
group by c1.grade
order by c1.grade;
编辑于 2024-01-23 22:26:28 回复(0)
select grade,sum(number) over(order by grade) t_rank
from class_grade
order by grade

发表于 2024-01-02 16:01:55 回复(0)
知识点:累加的窗口函数
select
    grade
    ,sum(number)over(order by grade) as t_rank
from 
    class_grade

发表于 2023-05-26 15:26:40 回复(0)
# 就是按照grade排序后算一下前缀和

select grade,
sum(number) over(order by grade asc) as t_rank
from class_grade
order by grade asc

发表于 2023-03-23 18:04:49 回复(0)
select grade,sum(number) over(order by rk) as t_rank
from (
    select grade,number,rank() over(order by grade) as rk
    from class_grade
)t

发表于 2023-01-06 22:57:38 回复(0)
select grade,sum(number) over(order by grade) as rk
from class_grade;

熟悉一下窗口函数

发表于 2022-11-16 23:59:00 回复(0)
select grade,
       sum(number) over(order by grade) as t_rank
from class_grade
order by grade
发表于 2022-09-13 20:53:36 回复(0)
select grade, sum(number) over(order by grade)t_rank
from class_grade
order by grade
发表于 2022-08-19 10:59:14 回复(0)
select cg1.grade,sum(cg2.number) as t_rank
from class_grade cg1 inner join class_grade cg2 on cg2.grade <= cg1.grade
group by cg1.grade
order by cg1.grade;
发表于 2022-06-15 15:21:29 回复(0)
天呐,我也不知道怎么解答出来的这个题目,代码是下面这样的:
select b.grade,sum(a.number) t_rank from class_grade a inner join class_grade b on a.grade <= b.grade group by b.grade order by b.grade;


发表于 2022-06-12 00:29:54 回复(1)
select grade,sum(number) over(order by grade asc) as t_rank from class_grade
发表于 2022-05-22 19:15:08 回复(0)