【妙解】查询每组中位数位置上的记录

考试分数(五)

http://www.nowcoder.com/questionTerminal/b626ff9e2ad04789954c2132c74c0512

#中位数本身就是先按自然数排名,再取数。排序函数选用row_number
方法一(妙解)
用一条规则统一奇数个数时和偶数个数时的中位数位置。无论奇偶,中位数的位置距离(个数+1)/2 小于1,不信你随便写个试试。
select id,job,score,s_rank
from 
(select *
        ,(row_number()over(partition by job order by score desc))as s_rank
	    ,(count(score)over(partition by job))as num
        from grade)t1
where abs(t1.s_rank-(t1.num+1)/2)<1
order by id;

方法二(常规思路):
#对grade表添加组内排名列作为表1,各组中位数的表(也就是上题的查询)作为表2,
#用相同组(job)关联表1表2,用where筛出表1中的组内排名等于表2中组内start位置或end位置。

⚠️复制时把倒数第二行的&nbs***bsp;替换成为or,否则报错。【复制代码注意】
select t1.id
        ,t1.job
        ,t1.score
        ,t1.s_rank
from 
(select id,job,score
        ,(row_number()over(partition by job order by score desc))as s_rank
        from grade)t1
join 
(select job
        ,case when count(score)%2=0 then ceiling(count(score)/2) else ceiling(count(score)/2)
        end as start1
        ,case when count(score)%2=0 then ceiling(count(score)/2+1) else ceiling(count(score)/2)
        end as end1
from grade
group by job)t2
on t1.job=t2.job 
where t1.s_rank=t2.start1&nbs***bsp;t1.s_rank=t2.end1
order by t1.id;


全部评论
方法一奇数和偶数应该分开讨论一下 case when t1.num%2=0 then abs(t1.t_rank-(t1.num+1)*1.0/2)<1 else abs(t1.t_rank-(t1.num+1)/2)<1 end
1 回复 分享
发布于 2021-06-16 17:11
方法一是不是存在这么一个缺点,有多个相同的中位数时候通过rownumber是找不出来全部的
5 回复 分享
发布于 2021-04-17 22:55
小红书
校招火热招聘中
官网直投
中位数的位置距离(个数+1)/2 小于1,里面的“个数”是什么
2 回复 分享
发布于 2021-07-29 13:35
牛逼 你怎么想到的 你他良的真是个人才
1 回复 分享
发布于 2022-12-01 09:56 浙江
确实妙
点赞 回复 分享
发布于 2021-03-24 00:24
充分利用窗口函数显示每行的特性
点赞 回复 分享
发布于 2021-04-01 23:07
问下我在方法二倒数第二行加了句 group by t1.job(虽然确实没啥必要),但用例就通不过了,这是咋回事
点赞 回复 分享
发布于 2021-04-21 16:15
确实妙
点赞 回复 分享
发布于 2021-09-16 17:58
第一个方法确实可以
点赞 回复 分享
发布于 2021-10-08 13:21
第一个方法中count(score)over(partition by job)并不是个数吧?聚合函数在窗口函数中只会对自身记录、及位于自身记录以上的数据进行计算
点赞 回复 分享
发布于 2022-03-02 23:14
请问方法一最后的where t1.s_rank=t2.start or t1.s_rank=t2.end1语句能不能放在联结中的on里面(实际放进去无法运行),什么时候要单独再where筛选,什么时候可以放在联结里?
点赞 回复 分享
发布于 2022-03-03 14:32
不太懂 a.b.s函数的用法
点赞 回复 分享
发布于 2022-03-25 12:57
大佬可以解释一下 where abs(t1.s_rank-(t1.num+1)/2)<1 的意思吗
点赞 回复 分享
发布于 2022-04-11 20:20
第一个解法,当有两个中位数,且分数相同(也就是排名相同)比如都是第二名,而row_number()排序出来的是不同的名次,我感觉是不是位置的查询和名次的查询需要分开
点赞 回复 分享
发布于 2022-09-13 12:29 湖北

相关推荐

124 10 评论
分享
牛客网
牛客企业服务