纪念一下,用最清晰的思路和最复杂的解法算出答案
先算每个成绩的最差排名:
with zc as(
select grade,sum(number)over(order by grade) g
from class_grade
order by grade),
再算每个成绩的最好排名:
zh as(
select grade,sum(number)over(order by grade)-number+1 g
from class_grade),
再算中位数对应的位数,注意如果总人数为奇数,会输出两个相同的答案,如果是偶数则不同:
zw as(
select case when sum(number)%2=1 then round(sum(number)/2,0)
else round(sum(number)/2,0) end w1,
case when sum(number)%2=1 then round(sum(number)/2,0)
else round(sum(number)/2,0)+1 end w2
from class_grade
),
再算上一步中第一个结果对应的成绩
yw as(
select grade from zh
where g<=(select w1 from zw)
order by grade desc
limit 1
),
以及第二个结果对应的成绩,如果总数是奇数,这两步会输出相同的结果
ew as(
select grade from zc
where g>=(select w2 from zw)
order by grade
limit 1
)
最后将上述所有步骤合并
with zc as(
select grade,sum(number)over(order by grade) g
from class_grade
order by grade),
zh as(
select grade,sum(number)over(order by grade)-number+1 g
from class_grade),
zw as(
select case when sum(number)%2=1 then round(sum(number)/2,0)
else round(sum(number)/2,0) end w1,
case when sum(number)%2=1 then round(sum(number)/2,0)
else round(sum(number)/2,0)+1 end w2
from class_grade
),
yw as(
select grade from zh
where g<=(select w1 from zw)
order by grade desc
limit 1
),
ew as(
select grade from zc
where g>=(select w2 from zw)
order by grade
limit 1
)
SELECT distinct grade from class_grade
where grade in (select * from yw)
or grade in (select * from ew)
order by grade