题目:569. 员工薪水中位数
题目链接
569员工薪水中位数
一、问题描述 & 准备知识
问题描述:
有如下的一张表,请求出每个公司工资的中位数。
输出结果:
- row_number()窗口函数使用
row_number() over(partition by Col order by Col)
- 中位数的求法
对于奇数:(count(Salary)+1)/2
对于偶数:(count(Salary))/2 和 (count(Salary))/2 + 1
但是对于这道题目我们可以这样来处理:Mysql 在计算(count(Salary))/2时,当count(Salary)为奇数时结果是一个浮点数,所以无论奇数还是偶数我们可以统一为(count(Salary))/2<=rank<=(count(Salary))/2 + 1。
Eg:
Id | Company | Salary | rank | counts |
---|---|---|---|---|
1 | A | 23 | 1 | 3 |
2 | A | 24 | 2 | 3 |
3 | A | 25 | 3 | 3 |
4 | B | 23 | 1 | 4 |
5 | B | 29 | 2 | 4 |
6 | B | 30 | 3 | 4 |
7 | B | 39 | 4 | 4 |
先看A公司(count(Salary))/2 = 1.5 ,(count(Salary))/2 + 1 = 2.5,则中位数rank = 2即Salary = 24。
再看B公司(count(Salary))/2 = 2,(count(Salary))/2 + 1 = 3,则中位数rank = 2 和 rank = 3即Salary = 29。
二、代码
2.代码
代码如下:
#建立一个临时表,表中包括Id,Company,Salary,在以Company分组后的排名以及每组的工资数
with t as
select
Id, Company, Salary,
row_number() over(partition by Company order by Salary) as rk,
count(Salary) over(partition by Company) as cnt
from
EmpCom
)
select
distinct Id, Company, Salary
from t
where
rk between cnt/2.0 and cnt/2.0+1
order by Company,Salary
总结
一般解决中位数的题型可以利用到窗口函数来快捷解决这一类问题。