题解 | #最差是第几名(二)#

最差是第几名(二)

https://www.nowcoder.com/practice/165d88474d434597bcd2af8bf72b24f1

搞不懂高赞的思路,所以就按自己的思路解出来了。虽然有点费劲,但比较好理解

发现搞不出来的时候,就举例罗列一下数据,画图,会比较容易厘清思路

思路

  1. 构造两个表:①中位数位置m1、m2,②grade、number、累计数t_rank(按grade降序)、前一行的累计数before_rank
  2. 比较表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 

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务