mysql查询中位数(窗口函数的使用)

mysql查询中位数(leetcode569的延伸)

Create table If Not Exists Employee (Id int, Company varchar(255), Salary int)
Truncate table Employee
insert into Employee (Id, Company, Salary) values ('1', 'A', '2341')
insert into Employee (Id, Company, Salary) values ('2', 'A', '341')
insert into Employee (Id, Company, Salary) values ('3', 'A', '15')
insert into Employee (Id, Company, Salary) values ('4', 'A', '15314')
insert into Employee (Id, Company, Salary) values ('5', 'A', '451')
insert into Employee (Id, Company, Salary) values ('6', 'A', '513')
insert into Employee (Id, Company, Salary) values ('7', 'B', '15')
insert into Employee (Id, Company, Salary) values ('8', 'B', '13')
insert into Employee (Id, Company, Salary) values ('9', 'B', '1154')
insert into Employee (Id, Company, Salary) values ('10', 'B', '1345')
insert into Employee (Id, Company, Salary) values ('11', 'B', '1221')
insert into Employee (Id, Company, Salary) values ('12', 'B', '234')
insert into Employee (Id, Company, Salary) values ('13', 'C', '2345')
insert into Employee (Id, Company, Salary) values ('14', 'C', '2645')
insert into Employee (Id, Company, Salary) values ('15', 'C', '2645')
insert into Employee (Id, Company, Salary) values ('16', 'C', '2652')
insert into Employee (Id, Company, Salary) values ('17', 'C', '65')

在这里插入图片描述

leetcode569:求员工薪水中位数

SELECT *,
case when abs(r1-r2)=1 then 0.5*sum(salary) over(partition by company)
when r1=r2 then salary end as median
from (select *,
cast(row_number() over(partition by company ORDER BY salary desc ,id desc) as signed) r1, 
cast(row_number() over(partition by company order by salary asc, id asc) as signed) r2
from employee) t
where abs(r1-r2)=1 or r1=r2

在这里插入图片描述

注意
  • SQL求中位数可以运用ROW_NUMBER()窗口函数正序反续构建两个列
  • 为对正反序列进行绝对值计算,需要cast()函数将其转化为signed类型
  • 若数据量为偶数,则中位数则为ABS(r1,r2)=1的两位数的平均值;若数据量为奇数,则中位数则为r1=r2的那位数
  • 然后搭配case when 语句以及sum()over()窗口函数即可求出各组中位数
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值