什么是中位数
一串数字,按从小到大排列,当总数是奇数时,取最中间的数;当总数是偶数时,取最中间两个数的平均数。
解决思路
按定义来,先排列,找出最中间的数,再取平均值。
准备表
CREATE TABLE student (
id VARCHAR(32) PRIMARY KEY,
VALUE INT
);
INSERT INTO student (id,VALUE) VALUES ('A',40);
INSERT INTO student (id,VALUE) VALUES ('B',50);
INSERT INTO student (id,VALUE) VALUES ('C',60);
INSERT INTO student (id,VALUE) VALUES ('D',70);
INSERT INTO student (id,VALUE) VALUES ('E',80);
INSERT INTO student (id,VALUE) VALUES ('F',90);
INSERT INTO student (id,VALUE) VALUES ('G',88);
INSERT INTO student (id,VALUE) VALUES ('H',80)
获取位数
SELECT GROUP_CONCAT(id), AVG(VALUE)
FROM (SELECT id, VALUE
FROM (SELECT id, @index:=@index+1 AS myindex, VALUE
FROM student, (SELECT @index:=0) AS initvar ORDER BY VALUE
) AS t WHERE FLOOR(@index/2+1)=myindex OR CEIL(@index/2)=myindex
) AS X
最内层是对成绩排序,并标注出名次,只执行最内层时结果如下: 对@变量类似rownum。注意:执行完最内层时,@index的值就是总行数
第二层取出最中间的两个值
注意:floor和ceil的顺序,
当@index是奇数时,floor(@index/2+1)和ceil(@index/2)的值一样的,@index=7时,floor(4.5)
= ceil(3.5) = 4 当@index是偶数时,floor(@index/2+1)和ceil(@index/2)的值不一样,@index=6时,floor(4) =
4,ceil(3) = 3
这就解决了中位数定义中如果总个数是奇数只取一位,总个数是偶数取中间两个的平均数的问题。
注:如果总个数是奇数,第二层执行完只会出来一行记录
最外层
取个平均数就行了。group_concat(id)只是用来看下中位数的学生是谁,可去掉。