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

最差是第几名(二)

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

看了下讨论度最高的答案,觉得是有漏洞的,下面为例。

假如A:3 B:4 C:6 D:6 total 19 正序:3 7 13 19 倒序:19 13 7 3 正序>=total/2,筛选出C、D列;倒序>=total/2,筛选出A、B列,中位数筛选不出来。

附上我自己的答案,欢迎讨论指正。

第一步,计算出按照等级顺序排列下的每一个等级下的数量区间。

    select 
    	grade,
        sum(number) over (order by grade) - number + 1 as lower,
        sum(number) over (order by grade) as upper
    from class_grade

第二步,参考了之前求中位数位置那道题的答案,求出中位数所在的位置

select 
	floor((sum(number) + 1)/2) as location1,
    floor((sum(number) + 2)/2) as location2
from class_grade) cg2

第三步,把以上两个表格join在一起

select *
from(select 
		grade,
        sum(number) over (order by grade) - number + 1 as lower,
        sum(number) over (order by grade) as upper
     from class_grade) cg1
cross join (select
                floor((sum(number) + 1)/2) as location1,
                floor((sum(number) + 2)/2) as location2
            from class_grade) cg2) tb

第四步,看中位数位置落在哪个区间,筛选出grade

select distinct grade
from(
    select *
    from(select
             grade,
             sum(number) over (order by grade) - number + 1 as lower,
             sum(number) over (order by grade) as upper
         from class_grade) cg1
    cross join (select
                    floor((sum(number) + 1)/2) as location1,
                    floor((sum(number) + 2)/2) as location2
                from class_grade) cg2) tb
where (location1 between lower and upper) or
      (location2 between lower and upper)
全部评论
倒序应该是D:6,C:6,B:4,A:3,sum(number) over (order by grade desc)应该是6,12,16,19,筛选出C,B,A
点赞 回复 分享
发布于 2022-11-02 17:11 内蒙古

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务