LeetCode569员工薪水中位数

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

你可能感兴趣的:(LeetCode569员工薪水中位数)