题解 | #考试分数(四)#
考试分数(四)
https://www.nowcoder.com/practice/502fb6e2b1ad4e56aa2e0dd90c6edf3c
同时输出中位数和中位数坐标
- 排列和计数
SELECT id, job, score, ROW_NUMBER() OVER (PARTITION BY job ORDER BY score) AS rn_1, COUNT(*) OVER (PARTITION BY job) AS cn FROM grade
- 中位数坐标
select job, floor((count(*)+1)/2) as start, floor((count(*)+2)/2) as end from rank_sc group by job order by job
- 求中位数
-- 求中位数没找到对应函数,但写也很容易 select job,avg(median_score) median_score from ( SELECT job, CASE WHEN cn % 2 = 1 AND rn_1 = (cn + 1) / 2 THEN score WHEN cn % 2 = 0 AND rn_1 in ((cn / 2.0),(cn/2.0)+1) THEN score ELSE NULL END AS median_score FROM rank_sc ) t1 group by job
- 最终代码
WITH rank_sc AS ( SELECT id, job, score, ROW_NUMBER() OVER (PARTITION BY job ORDER BY score) AS rn_1, COUNT(*) OVER (PARTITION BY job) AS cn FROM grade ) ,rank_sc_start_end as( select job, floor((count(*)+1)/2) as start, floor((count(*)+2)/2) as end from rank_sc group by job ) select rsse.job,median_score,start,end from rank_sc_start_end rsse join ( select job,avg(median_score) median_score from ( SELECT job, CASE WHEN cn % 2 = 1 AND rn_1 = (cn + 1) / 2 THEN score WHEN cn % 2 = 0 AND rn_1 in ((cn / 2.0),(cn/2.0)+1) THEN score ELSE NULL END AS median_score FROM rank_sc ) t1 group by job ) t2 on rsse.job=t2.job order by rsse.job