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
网友评论