MySQL查询一组数据的众数和中位数

版权声明:本文为博主原创文章,转载请附上博文链接。 https://blog.csdn.net/qq_41080850/article/details/88107491

查询一组数据的众数:

方法1:仅适用于一组数据只有一个众数的情况

    1)首先对数据按照值的不同进行分组,并对每组中的数据进行计数,再根据计数的大小进行降序排序;

    2)上述1)中结果集的第一行即要求取的众数所在的行。

方法2:适用于一组数据有一个或多个众数的情况

    1)首先对数据按照值的不同进行分组,并对每组中的数据进行计数;

    2)使用max函数找出统计个数的最大值及其对应的被统计值,此被统计值就是要求的众数。

创建测试用表:

# 创建学生成绩表:
create table grade(
id int,
name varchar(10),
score int (10)
)engine myisam charset utf8mb4;
 
# 向成绩表中插入数据:
insert into grade values
(1,'张无忌',85),
(2,'李隆基',59),
(3,'王五',60),
(4,'曹操',79),
(5,'小明',90),
(6,'如花',60),
(7,'尉迟恭',100),
(8,'欧阳风',90),
(9,'刘备',90),
(10,'董永',99),
(11,'冯钰',83),
(12,'孙殿英',82);

查询学生成绩表garde中分数的众数及其出现的次数:

先查看garde表的整体信息:

select * from garde

方法1代码及查询结果:

方法2代码及查询结果:

为简化SQL语句,将方法2中的第一步处理——对数据按照值的不同进行分组,并对每组中的数据进行计数写成视图:

create view grouped_grade as
select score,count(score) as number from grade group by score;

查看视图grouped_grade中的信息:

select score,number from grouped_grade;

使用max函数从视图grouped_grade中找到所有分数的众数及其出现的次数:

select score,number from grouped_grade where number=(select max(number) from grouped_grade);

查询结果为:

查询一组数据的中位数:

网上看到一个很巧妙的方法:

SET @rowindex := -1;
 
SELECT
   AVG(g.score) AS median
FROM
   (SELECT @rowindex:=@rowindex + 1 AS rowindex,
           score 
    FROM grade
    ORDER BY score) AS g
WHERE
g.rowindex IN (FLOOR(@rowindex / 2) , CEIL(@rowindex / 2));

代码解析:上述查询方法的核心思想是对于一组要求其中位数的数据,无论数据的总行数是奇数还是偶数,都取这组数据排序后最中间的两个数的平均值作为中位数(当数据的总行数是奇数时,数据经排序后最中间的数取两次以计算平均值)。

上述代码的查询结果为:

对grade表中的score按照升序进行排序,根据排序结果验证前文查询出的中位数是否正确:

经比较可知,前文查询出的中位数是正确的。

参考:

https://blog.csdn.net/qq_41080850/article/details/86310311

https://blog.csdn.net/hj7jay/article/details/78130419

猜你喜欢

转载自blog.csdn.net/qq_41080850/article/details/88107491
今日推荐