首页 > 试题广场 >

最差是第几名(二)

[编程题]最差是第几名(二)
  • 热度指数:58727 时间限制: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
C 4
B 4
D 2
第1行表示成绩为A的学生有2个
.......
最后1行表示成绩为D的学生有2个

老师想知道学生们综合成绩的中位数是什么档位,请你写SQL帮忙查询一下,如果只有1个中位数,输出1个,如果有2个中位数,按grade升序输出,以上例子查询结果如下:
grade
B
C
解析:
总体学生成绩排序如下:A, A, B, B, B, B, C, C, C, C, D, D,总共12个数,取中间的2个,取6,7为:B,C


示例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),
('C',4),
('B',4),
('D',2);

输出

B
C
头像 SunburstRun
发表于 2021-03-10 15:09:20
精华题解 首先我们需要知道:当某一数的正序和逆序累计均大于整个序列的数字个数的一半即为中位数 比如: A A B B C C D D  1 2 3  4  5 6  7 8 8 7 6  5  展开全文
头像 高质量搬砖人
发表于 2021-04-03 10:45:23
参考大牛的解法,绝了 当某一数的正序和逆序累计均大于整个序列的数字个数的一半即为中位数 select grade from (select grade, (select sum(number) from class_grade) as total, sum(number)ov 展开全文
头像 此用户名涉嫌违规
发表于 2021-04-07 15:28:18
题目描述:老师想知道学生们综合成绩的中位数是什么档位,请你写SQL帮忙查询一下,如果只有1个中位数,输出1个,如果有2个中位数,按grade升序输出。个人思路:步骤一、为各个grade添加排名取值范围(t_rank,section)。步骤二、找出总共参与考试的学生人数(total)。步骤三、找出中位 展开全文
头像 DQ_restart
发表于 2022-02-16 13:54:22
这道题还是比较折磨人的,题目里说明当总人数是偶数时,要取出两个人,譬如12个人,那么就要取出6号和7号,如果13个人,只需要取出7号,我一开始就把中位数分两种情况考虑。于是我就这样子被绕了40分钟解决不了,提交代码后更是一直被4/6用例折磨 随着肚子饿了,终于灵光一闪,唉呀妈呀这中位数 展开全文
头像 _小胡同学
发表于 2022-03-20 13:33:55
看了几个大佬写的题解,确实都很厉害,在这里我再提出一种新的解法(因为当初看题解的时候自己其实已经做到最后一步了,就想花点时间去按照自己的思路写出来,不想半途放弃o(╥﹏╥)o) 1 首先还是利用 sum() over()窗口函数求出各等级最差排名 select grade,number,sum(nu 展开全文
头像 牛客40547671号
发表于 2021-11-18 17:13:10
解题思路 将grade的名次的范围找出来 select grade,(select sum(number) from class_grade c1 where c1.grade < c2.grade) as s, (select sum(number) from class_grade c 展开全文
头像 Dame、CX
发表于 2021-05-21 10:27:45
SELECT grade FROM ( SELECT grade, SUM(number) OVER(ORDER BY grade) AS rk1,#累计求和正序排序 SUM(number) OVER(ORDER BY grade DESC 展开全文
头像 dododobiu
发表于 2021-08-24 23:30:34
高赞写法是有问题的,正确写法如下:with a as ( select grade, sum(number) over(order by grade) as cnt, row_number() over(order by grade) as ran from cl 展开全文
头像 sjd_
发表于 2024-11-10 14:25:15
select grade from ( select grade, (select sum(number) from class_grade) as total, sum(number)over(order by grade) a, sum(number)over(o 展开全文
头像 想到就去做
发表于 2021-09-08 11:40:07
(select gradefrom (select grade,sum(number)over(order by grade) s1, sum(number)over() / 2 m from class_grade order by grade) awhere a.s1 > 展开全文
头像 山水间边
发表于 2021-08-26 14:14:33
1、大牛的思路:当某一数的正序和逆序累计均大于整个序列的数字个数的一半即为中位数! select grade from (select grade, (select sum(number) from class_grade) as total, #累和 sum(number) 展开全文