首页 > 试题广场 >

考试分数(四)

[编程题]考试分数(四)
  • 热度指数:68309 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

牛客每次考试完,都会有一个成绩表(grade),如下:

id job score
1 C++
11001
2 C++
11000
3 C++
9000
4 JAVA
12000
5 JAVA
13000
6 B
12000
7
B
11000
8 B
9999

第1行表示用户id为1的用户选择了C++岗位并且考了11001分

。。。

第8行表示用户id为8的用户选择了B语言岗位并且考了9999分

请你写一个sql语句查询各个岗位分数升序排列之后的中位数位置的范围,并且按job升序排序,结果如下:

job start end
B 2 2
C++ 2 2
Java 1 2

解释:

第1行表示C++岗位的中位数位置范围为[2,2],也就是2。因为C++岗位总共3个人,是奇数,所以中位数位置为2是正确的(即位置为2的10000是中位数)

第2行表示Java岗位的中位数位置范围为[1,2]。因为Java岗位总共2个人,是偶数,所以要知道中位数,需要知道2个位置的数字,而因为只有2个人,所以中位数位置为[1,2]是正确的(即需要知道位置为1的12000与位置为2的13000才能计算出中位数为12500)

第3行表示前端岗位的中位数位置范围为[2,2],也就是2。因为B语言岗位总共3个人,是奇数,所以中位数位置为2是正确的(即位置为2的11000是中位数)

(注意: sqlite 1/2得到的不是0.5,得到的是0,只有1*1.0/2才会得到0.5,sqlite四舍五入的函数为round,sqlite不支持floor函数,支持cast(x as integer) 函数,不支持if函数,支持case when ...then ...else ..end函数)

示例1

输入

drop table if exists grade;
CREATE TABLE  grade(
`id` int(4) NOT NULL,
`job` varchar(32) NOT NULL,
`score` int(10) NOT NULL,
PRIMARY KEY (`id`));

INSERT INTO grade VALUES
(1,'C++',11001),
(2,'C++',10000),
(3,'C++',9000),
(4,'Java',12000),
(5,'Java',13000),
(6,'B',12000),
(7,'B',11000),
(8,'B',9999);

输出

B|2|2
C++|2|2
Java|1|2
头像 阿怪1227
发表于 2021-01-27 10:15:17
发现这样也可以呦,简单易懂 SELECT job, floor(( count(*) + 1 )/ 2 ) AS "start", floor(( count(*) + 2 )/ 2 ) AS 'end' FROM grade GROUP BY job ORDER BY j 展开全文
头像 qstalking
发表于 2021-01-26 15:11:42
#中位数的特征: #当个数为偶数时,中位数的起始位置等于个数/2,结束位置等于个数/2+1 #当个数为奇数时,中位数的起始位置等于向上取整(个数/2),结束位置等于向上取整(个数/2) #用除以2的余数是否为0来判断奇偶,%2=0 #记得取整数,本题用ceiling函数向上取整(返回不小于该数的 展开全文
头像 此用户名涉嫌违规
发表于 2021-04-06 09:32:37
题目描述:sql语句查询各个岗位分数升序排列之后的中位数位置的范围,并且按job升序排序。个人思路:没什么好讲的,首先找出各岗位对应总报考数。总数为偶的情况,中位数为中间的两个。总数为奇的情况,中位数就是中间那个。注意:不要跟python搞混了,mysql里是没有//这种运算符的!! 代码:最直接的 展开全文
头像 jiang_dr
发表于 2021-11-12 09:28:00
思路:我们先来了解一下取整的几个函数 ceil() / ceiling() 向上取整;示例: ceil(1.2) = 2 floor() 向下取整;示例: floor(1.2) = 1 round() 四舍五入 法一:使用round解决: select job, round(co 展开全文
头像 SunburstRun
发表于 2020-09-21 10:40:28
首先肯定是根据不同的岗位来的,故总体架构为: select xxx from grade  group by job order by job; 因为只是求中位数的位置,故不需要排序,也不需要知道中位数是多少。 展开全文
头像 great、DY
发表于 2021-10-11 09:46:20
先分组聚合函数求出各job的分数个数num, 再逻辑函数判断出num为奇或为偶,连接各自计算公式 select job, case when mod(num,2)=1 then round((num+1)/2) else round(num/2) end as start, case when mo 展开全文
头像 让随着风飘
发表于 2020-09-19 20:57:07
select job,(max(seq)+min(seq))/2 as start,printf("%d",round((max(seq)+min(seq))*1.0/2)) as end from (select id,job,score,count() over(partition by j 展开全文
头像 工具人二号
发表于 2021-08-31 13:09:44
用到了MOD函数和case when循环,第一遍写又忘了加END SELECT job ,ROUND(CASE MOD(COUNT(score),2) WHEN 1 THEN COUNT(score)/2+0.5 ELSE COUNT(score)/2 end,0) ,ROU 展开全文
头像 高质量搬砖人
发表于 2021-02-01 13:04:33
方法)找出中位数位置 SELECT job, FLOOR((COUNT(score)+1)/2 )AS start, FLOOR((COUNT(score)+2)/2) AS end FROM grade GROUP BY job ORDER BY job;
头像 牛客926943512号
发表于 2020-11-22 11:51:37
SELECT job, CASE WHEN count(id)%2=1 THEN (count(id)+1)/2 WHEN count(id)%2=0 THEN count(id)/2 END AS start, 展开全文