考试分数(五)

考试分数(五)

http://www.nowcoder.com/questionTerminal/b626ff9e2ad04789954c2132c74c0512

通过考试分数(四) https://blog.nowcoder.net/n/64e552f2359141f1bc730f00dad84cb9 我们知道,中位数的位置信息,也就是升序之后的排名信息,得到A表:
(select job, cast((count(id)+1)/2 AS INTEGER) as 'start' , (cast((count(id)+1)/2 AS INTEGER)+(case when count(id)%2=1 then 0 else 1 end)) as 'end'
from grade 
group by job) A

又通过考试分数(三) https://blog.nowcoder.net/n/297da9871a8f4fd39ad939cbfc907093 知道,求不同工作(job)里面的每个人的信息与排名,可以如下写,得到B表:
(select g1.*, (
    select count(distinct g2.score) 
    from grade g2 
    where g2.score>=g1.score and g1.job=g2.job) as rank
from grade g1 ) B
大概得到的情况如下:

所以 B表里面有所有的信息,但是要提取中位数的信息,恰好A有中位数的信息,那么联立A,B表,并且当工作(job)相同并且,B的排名(rank)在A表的中位数位置之间,那么就表明这个信息是中位数的信息,最后联立得:
select B.* from
(select job, cast((count(id)+1)/2 AS INTEGER) as 'start' , (cast((count(id)+1)/2 AS INTEGER)+(case when count(id)%2=1 then 0 else 1 end)) as 'end'
from grade 
group by job) A

JOIN
(select g1.*, (
    select count(distinct g2.score) 
    from grade g2 
    where g2.score>=g1.score and g1.job=g2.job) as rank
from grade g1 ) B

on (A.job=B.job  and B.rank between A.start and A.end)
order by B.id

mysql解法:(mysql 8.0rank是关键字,不能直接用)
select B.* from
(SELECT job,FLOOR((COUNT(*)+1)/2) AS `start`,FLOOR((COUNT(*)+1)/2)+if(COUNT(*) % 2=1,0,1) AS `end` 
FROM grade  GROUP BY job) A

JOIN
(select g1.*, (
    select count(distinct g2.score) 
    from grade g2 
    where g2.score>=g1.score and g1.job=g2.job) as t_rank
from grade g1 ) B

on (A.job=B.job  and B.t_rank between A.start and A.end)
order by B.id



全部评论
count(distinct g2.score) 这里有点问题就是,count(distinct score)需要在分数都不相同得前提下才能得到准确的数,如果分数是相同得,那么统计得结果是错的。
点赞 回复 分享
发布于 2021-01-16 15:13
非常感谢你分享的思路,之前在链接条件(B.t_rank between A.start and A.end)卡了很久。在你的基础上做了一点优化: select g.* from (select *, dense_rank()over(partition by job order by score desc) as t_rank from grade) g join (select job, ceil(count(*)/2) a,ceil((count(*)+1)/2)b from grade group by job) g1 on g.job = g1.job and t_rank between a and b order by g.id
点赞 回复 分享
发布于 2021-03-28 12:19

相关推荐

02-20 11:06
已编辑
中北大学 算法工程师
点赞 评论 收藏
分享
mq2:我倒是觉得这种敞亮一点好。能接受就去不能就不去呗。 完了跟现在“正常”公司一样,hr说的天花乱坠,进去一看根本就是996核动力牛马,想走又没应届生身份了。岂不是更糟。
点赞 评论 收藏
分享
评论
15
2
分享

创作者周榜

更多
牛客网
牛客企业服务