目录
问题说明
求各公司人员薪资的中位数,若公司人员为偶数个,如4人,则中位数为第二和第三的平均值。
建表语句与示例数据如下
create table zws_demo(company varchar(10),salary double);
insert into zws_demo values('A',123),('A',234),('A',345),
('B',12),('B',23),('B',34),('B',45);
问题解决
要取中位数,首先需要对于每个公司的薪资进行排序(默认即可,这个不影响),然后对于公司人员数量计算。以上结果作为子查询,再在外部进行条件过滤即可,过滤思路如下
假设一个公司有3个人,那么此时中位数应该为2,floor( (3+1) / 2)=2
若一个公司有4个人,那么中位数应该为2,3求平均,floor( (4+2)/2 )=3,floor( (4+1)/2 )=2
显然,在外部查询时加上判断,rn in ( floor( (length+1) /2), floor( (length+2) /2) )的判断即可。
子查询结果
完整代码实现
select company,
avg(salary)
from
(
select company,
salary,
row_number() over(partition by company order by salary) as rn,
count(*) over(partition by company) as length
from zws_demo
) tmp
where rn in ( floor((length+1)/2), floor((length+2)/2) )
group by company;