题解 | #最差是第几名(二)#
最差是第几名(二)
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