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

最差是第几名(二)

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

参考大佬的解法,把其中涉及的知识点简单陈述一下
    1.with as (..) 其实就是子查询部分,其实没啥大用,主要是为了代码的可读性,相当于创建了一个临时表,后面用起来比较方便。

    2.关于中位数的判定方法。此题的解法是分别求出 total , a(正序排列) ,b(逆序排列)。要注意total为奇偶时,判定条件略有不同,可以这样理解:
       当total 为奇数时,if 某个数的正序排列位置 > total/2某个数的逆序排列位置 > total/2 则该数为中位数。(举例 :total = 7 ,表中数据为1234567,按照题目要求,要输出的结果为4,其中4的正序位置为4,逆序位置也为4 ,4 > 7/2=3 ,所以成立。)
       当total 为偶数时,if 某个数的正序排列位置 >= total/2某个数的逆序排列位置 >= total/2 则该数为中位数。(举例 :total = 8 ,表中数据为12345678,按照题目要求,要输出的结果为4和5,其中4的正序位置为4,逆序位置也为5 ,4>= 8/2 且 5 >= 8/2;同理 数字5的正序位置为5 ,逆序位置为4 ,5>= 8/2 且 4 >= 8/2,所以成立)
       题解中很多大佬的答案都没办法通过就是没有区分total 奇偶的情况。

    3.主要是窗口函数的用法。窗口函数的用途:需要找到每组内排名等业务需求。通俗点理解就是可以在表上加一列你感兴趣的信息(排序、总和、平均值等)。基本语法:
        <窗口函数> over ( paratition by <用于分组的列名>
                        order by <用于排序的列名> )

知识点介绍完毕,本题的代码如下:

with t_rank as
(
select grade,
(select sum(number) from class_grade) as total,
sum(number) over(order by grade) a,
sum(number) over(order by grade desc) b
from class_grade
order by grade
)
select grade
from t_rank
where (case when total % 2 == 1 then a> total /2 and b>total/2
else a>= total /2 and b>=total/2 end)
order by grade

全部评论

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务