Question:
Employee 表包含所有员工。Employee 表有三列:员工Id,公司名和薪水。
image.png
编写SQL查询来查找每个公司的薪水中位数。挑战点:你是否可以在不使用任何内置的SQL函数的情况下解决此问题。
image.png
思路:
1、按照company进行分组排序—中位数在每组数据里面的靠中间排序的地方
2、计算每组里面的数据总数—每组的中间位置,和各组数据总数有关
3、限定每组company中的中位数所在位置—位置在num/2~num/2+1
查询出表a:利用变量@求得的分组排序
查询出表b:每个company的总数
表a join 表b:在一个表里获得排序和各组总数
where:条件限定,选出ranking在每组数据中的正确位置
select t.id,t.company,t.salary
from
(select a.id,a.company,a.salary,a.ranking,b.num
from
(select id,company,salary,
if(@pre_company=company,@cur_rank:=@cur_rank+1,@cur_rank:=1) ranking,
@pre_company:=company
from
employee3,(select @pre_company:=null,@cur_rank:=1) r
order by company,salary) a
join
(select company,count(*) num from employee3 group by company) b
on a.company=b.company
) t
where t.ranking between t.num/2 and t.num/2+1
网友评论