leetcode571给定数字的频率查询中位数

Question:
numbers表中保存着数字的值和频率:


image.png

在此表中数字为:0、0、0、0、0、0、0、1、2、2、2、3,所以中位数是(0+0)/2=0
编写一个查询来查找所有数字的中位数并将结果命名为median.


image.png

思路:
1、计算数据的总个数sum(frequency) num;
2、利用总个数来判断中位数所应处于的位置:
如果num为偶,则中位数位于num/2 num/2+1
如果num为奇,则中位数位于num/2+0.5;
3、利用2中求得中位数的位置来确定原表中正好处于该位置上的数,按照数据排序,并根据频数范围来判断。

select (sum(r1)+sum(r2))/2 median
from
(
select if(z1>@m and z1<=@m:=@m+frequency,number,0) r1,
             if(z2>@m and z2<=@m:=@m+frequency,number,0) r2
 from
        (
         select if(num%2=0,num/2,num/2+0.5) z1,
                        if(num%2=0,num/2+1,num/2+0.5) z2
         from
                    (select sum(frequency) num from numbers) b)t ,
        (select @m:=0,@n:=0) r,
        (select * from numbers order by number) y   
) p

你可能感兴趣的:(leetcode571给定数字的频率查询中位数)