列表

详情


SQL281. 最差是第几名(一)

描述

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Sqlite 解法, 执行用时: 10ms, 内存消耗: 3372KB, 提交时间: 2021-12-03

select
    a.grade,
    SUM(b.number) AS t_rank
FROM
    class_grade a
    JOIN class_grade b ON a.grade >= b.grade
group by
    a.grade
order by
    a.grade
	

Sqlite 解法, 执行用时: 10ms, 内存消耗: 3456KB, 提交时间: 2021-11-30

select a.grade, sum(b.number) as t_rank from class_grade as a left join class_grade as b on a.grade>= b.grade group by a.grade;

Sqlite 解法, 执行用时: 10ms, 内存消耗: 3480KB, 提交时间: 2021-09-10

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

Sqlite 解法, 执行用时: 10ms, 内存消耗: 3480KB, 提交时间: 2021-09-01

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

Sqlite 解法, 执行用时: 10ms, 内存消耗: 3492KB, 提交时间: 2021-09-14

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