题解 | #考试分数(五)#

考试分数(五)

https://www.nowcoder.com/practice/b626ff9e2ad04789954c2132c74c0512

SELECT id,job,score,rk_b as t_rank
FROM (SELECT id,job,score,
    ROW_NUMBER()OVER(PARTITION BY job ORDER BY score) rk_a,
    ROW_NUMBER()OVER(PARTITION BY job ORDER BY score DESC) rk_b
FROM grade
) m
JOIN (
    SELECT job,count(1) job_count
    FROM grade
    GROUP BY job
) n
USING (job)
WHERE rk_a >= job_count / 2 AND rk_b >= job_count / 2
ORDER BY id

要计算中位数,可以先计算一组序列的正序排序、逆序排序,在取>= 序列长度一半的序列

比如有一个序列如下:nums = [4 6 8 10 16],长度为5

  • 正序:[1 2 3 4 5] -> 3 4 5(8 10 16)
  • 逆序:[5 4 3 2 1] -> 5 4 3(4 6 8)

正序和逆序的交集 -> 8,即我们所得的中位数

1、首先开窗按job分区,成绩排序。得到成绩的正序和逆序

SELECT id,job,score,
    ROW_NUMBER()OVER(PARTITION BY job ORDER BY score) rk_a,
    ROW_NUMBER()OVER(PARTITION BY job ORDER BY score DESC) rk_b
FROM grade

2、得到每个job的个数

    SELECT job,count(1) job_count
    FROM grade
    GROUP BY job

3、联合两张表计算中位数

SELECT id,job,score,rk_b as t_rank
FROM m
	JOIN  n
USING (job)
WHERE rk_a >= job_count / 2 AND rk_b >= job_count / 2

4、完整代码如下,对id进行排序

SELECT id,job,score,rk_b as t_rank
FROM (SELECT id,job,score,
    ROW_NUMBER()OVER(PARTITION BY job ORDER BY score) rk_a,
    ROW_NUMBER()OVER(PARTITION BY job ORDER BY score DESC) rk_b
FROM grade
) m
JOIN (
    SELECT job,count(1) job_count
    FROM grade
    GROUP BY job
) n
USING (job)
WHERE rk_a >= job_count / 2 AND rk_b >= job_count / 2
ORDER BY id

全部评论

相关推荐

Cons_W:我9本的,同样找不到。感觉是岗位太少的问题,可能12月份没多少岗位的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务