题目描述:sql语句查询各个岗位分数升序排列之后的中位数位置的范围,并且按job升序排序。
个人思路:没什么好讲的,首先找出各岗位对应总报考数。总数为偶的情况,中位数为中间的两个。总数为奇的情况,中位数就是中间那个。
注意:不要跟python搞混了,mysql里是没有//这种运算符的!!
代码:
最直接的写法:
select job ,
floor((sum(1)+1)/2) as start,
floor((sum(1)+2)/2) as end
from grade
group by job
order by jobFLOOR(x) 返回小于或等于 x 的最大整数.
sum(1)跟count(*)是一个意思都是对获取总行数的意思。因为这里我们按照job进行分组,所以获取的每个job的总行数。
case..when..then..else写法 :
with t1 as
(
select job, count(score) as num
from grade
group by job
)
select job,
(case when num%2=0 then ceil(num/2) else ceil(num/2) end)as start,
(case when num%2=0 then ceil(num/2+1) else ceil(num/2) end) as end
from t1
order by jobCEIL(x) 返回大于或等于 x 的最小整数.
if函数:
with t1 as
(
select job, count(score) as num
from grade
group by job
)
select job,
if(num%2=0, ceil(num/2), ceil(num/2))as start,
if(num%2=0, ceil(num/2+1), ceil(num/2)) as end
from t1
order by jobIF(expr,v1,v2) 如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2。

京公网安备 11010502036488号