题解 | #最差是第几名(二)#
最差是第几名(二)
https://www.nowcoder.com/practice/165d88474d434597bcd2af8bf72b24f1
搞不懂高赞的思路,所以就按自己的思路解出来了。虽然有点费劲,但比较好理解
发现搞不出来的时候,就举例罗列一下数据,画图,会比较容易厘清思路
思路
- 构造两个表:①中位数位置m1、m2,②grade、number、累计数t_rank(按grade降序)、前一行的累计数before_rank
- 比较表1、表2:中位数位置m1,m2 是否在 t_rank 和 before_rank之间。如果是,则select grade
代码
select
d.grade
from(
# 筛选出t_rank 大于中位数记录,增加一列「上一行的t_rank」
select
c.grade,
c.t_rank,
lag(c.t_rank)over(order by c.grade asc) as before_rank # 选出该行记录 上一行的t_rank
from (
select
grade,
sum(number)over(order by grade asc) as t_rank # 计算每个grade的累计值
from class_grade
order by grade asc
)c
)d,
(
# 中位数的位置区间
select
floor((sum(number)+1)/2) as m1, #向下取整
ceiling((sum(number)+1)/2) as m2 #向上取整
from class_grade
)b
where (b.m1 > d.before_rank and b.m1 <= d.t_rank)
or (b.m2 > d.before_rank and b.m2 <= d.t_rank)
# 注意左开右闭,所以不能用between and

