首页 > 试题广场 >

最差是第几名(一)

[编程题]最差是第几名(一)
  • 热度指数:41737 时间限制: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
头像 牛客题解官
发表于 2025-03-21 15:04:48
精华题解 题目描述 我们有一个表: class_grade:包含班级成绩信息,包括成绩等级 grade 和该等级的学生人数 number。 目标是查询出每个成绩等级的学生最差排名,并按成绩等级升序排列。根据示例可知,最差排名即每个成绩等级的累积和。 知识点 窗口函数:使用SUM窗口函数计算每个成绩等级的 展开全文
头像 SunburstRun
发表于 2021-03-10 14:34:55
本题出题的题意其实主要是考察sum() over (order by ) 开窗函数,sum(a) over (order by b) 的含义是: 例如 a  b 1 2 3 4 5 6 按照b列排序,将a依次相加,得到 展开全文
头像 码尚行动
发表于 2021-03-14 20:28:29
理解题意:最差名次,即该等级中的最后一名对应的名次(将小于等于该等级的人数相加 作为最差名次) 两种解法,两个知识点:case函数以及开窗函数(MySQL8.0 引入),其中case命令为面试笔试中常考知识点。 case函数 # 不用MySQL8.0的开窗函数 -- case when then 展开全文
头像 早起的虫儿e
发表于 2021-04-20 10:38:03
问题描述:请你写出一个SQL查询,如果一个学生知道了自己综合成绩以后,最差是排第几名? 结果按照grade升序排序,以上例子查询如下: 方案1:采用窗口函数SUM() OVER() SELECT grade,SUM(number) OVER(ORDER BY grade ASC) AS t_cnt 展开全文
头像 高质量搬砖人
发表于 2021-04-03 10:14:39
用转置函数 case when 解决 select grade , case grade when 'A' then (select sum(number) from class_grade where grade <= 'A') when 'B' then (sele 展开全文
头像 jiang_dr
发表于 2021-11-25 09:20:02
思路:最差排名 = 比自己成绩等级高的number总数 + 自己成绩等级number的个数 技巧:单表如果需要有排序,那么自连接一定可以解决 select t1.grade, sum(t2.number) as t_rank from class_grade as t1 join class_gra 展开全文
头像 Ding_123
发表于 2021-12-09 18:00:41
知识点 使用窗函数对grade进行分组然后,使用sum() over (order by ) 开窗函数,sum(a) over (order by b) 的含义是:按照b列排序,将a依次相加 代码 select grade, sum(number) over(order by grade) as 展开全文
头像 Joneln
发表于 2021-11-15 16:15:30
select grade, sum(number) over(order by grade) as t_rank from class_grade order by grade; sum(a) over(order by b) 窗口函数的含义是按照b列的升序顺序依次对a列进行求和。 其实,最后一 展开全文
头像 秋天Code
发表于 2023-07-26 16:36:54
不使用窗口函数 SELECT a.grade, SUM(b.number) FROM class_grade a JOIN class_grade b ON a.grade >= b.grade GROUP BY a.grade ORDER BY a.grade 使用 展开全文
头像 呼啦啦NO.1
发表于 2021-12-20 08:51:06
最简单的解题方法 利用累加开窗函数 sum(number)over(order by xxx) 解题思路:A B C D E 5个段有多少学生,我们是知道的,但是并没有把这些数据拼在一起。由此,只要将这些每个段多少学生全部分组累加起来,我们就知道学生的总数了,而总数 = 最后一名。我们就可以知道最差 展开全文
头像 wzying
发表于 2023-03-28 01:32:09
select grade, case when grade='A' then (select sum(a.number) from (select * from class_grade order by grade limit 1) a) when grade='B' then (select 展开全文