• 技术文章 >数据库 >mysql教程

    在 MySQL 中,如何计算一组数据的中位数

    藏色散人藏色散人2019-09-12 11:08:53转载3843
    要得到一组数据的中位数(例如某个地区或某家公司的收入中位数),我们一般要将这一任务细分为 3 个小任务:

    1.将数据排序,并给每一行数据给出其在所有数据中的排名;

    2.找出中位数的排名数字;

    3.找出中间排名对应的值;

    下面以某公司员工月收入为例,示例 MySQL 的一些复杂语句的使用。

    方法一

    创建测试表

    首先创建一个收入表,建表语句为:

    CREATE TABLE IF NOT EXISTS `employee` (
      `id`     INT                  AUTO_INCREMENT PRIMARY KEY,
      `name`   VARCHAR(10) NOT NULL DEFAULT '',
      `income` INT         NOT NULL DEFAULT '0'
    )
      ENGINE = InnoDB
      DEFAULT CHARSET = utf8;
    INSERT INTO `employee` (`name`, `income`)
    VALUES ('麻子', 20000);
    INSERT INTO `employee` (`name`, `income`)
    VALUES ('李四', 12000);
    INSERT INTO `employee` (`name`, `income`)
    VALUES ('张三', 10000);
    INSERT INTO `employee` (`name`, `income`)
    VALUES ('王二', 16000);
    INSERT INTO `employee` (`name`, `income`)
    VALUES ('土豪', 40000);

    完成任务 1

    将数据排序,并给每一行数据给出其在所有数据中的排名:

    SELECT t1.name, t1.income, COUNT(*) AS rank
    FROM employee AS t1,
         employee AS t2
    WHERE t1.income < t2.income
       OR (t1.income = t2.income AND t1.name <= t2.name)
    GROUP BY t1.name, t1.income
    ORDER BY rank;

    查询结果为:

    492a81f0598eb5622f488d41ac30bdf.png

    php入门到就业线上直播课:进入学习

    完成小任务 2

    找出中位数的排名数字:

    SELECT (COUNT(*) + 1) DIV 2 as rank
    FROM employee;

    查询结果为:

    210205328ff0784952f3dfa5b67f612.png

    完成小任务 3

    SELECT income AS median
    FROM (SELECT t1.name, t1.income, COUNT(*) AS rank
          FROM employee AS t1,
               employee AS t2
          WHERE t1.income < t2.income
             OR (t1.income = t2.income AND t1.name <= t2.name)
          GROUP BY t1.name, t1.income
          ORDER BY rank) t3
    WHERE rank = (SELECT (COUNT(*) + 1) DIV 2 FROM employee)

    查询结果为:

    835e75d07d4ffd52a5482c8a08e89f3.png

    至此,我们就找到了如何从一组数据中获得中位数的方法。

    方法二

    下面,来介绍另外一种优化排名语句的方法。

    我们都知道如何给一组数据做排序操作,在本例中,实现方法如下:

    SELECT name, income
    FROM employee
    ORDER BY income DESC

    查询结果为:

    f5b6fd78598104e12fb46a8db24c6ed.png

    那我们可不可以更进一步,对查询出的结果加一列,这一列的数据为排名呢?

    我们可以通过 3 个自定义变量的方法来实现这一目标:

    第一个变量用来记录当前行数据的收入

    第二个变量用来记录上一行数据的收入

    第三个变量用来记录当前行数据的排名

    SET @curr_income := 0;
    SET @prev_income := 0;
    SET @rank := 0;
    SELECT `name`,
           @curr_income := income                                      AS income,
           @rank := if(@prev_income != @curr_income, @rank + 1, @rank) AS rank,
           @prev_income := @curr_income                                AS dummy
    FROM employee
    ORDER BY income DESC

    查询结果如下:

    e755927d76f35a4d443d9fed3c4b927.png

    然后再找出中位数的排名数字,进一步找出收入的中位数:

    SET @curr_income := 0;
    SET @prev_income := 0;
    SET @rank := 0;
    SELECT income AS median
    FROM (SELECT `name`,
                 @curr_income := income                                      AS income,
                 @rank := if(@prev_income != @curr_income, @rank + 1, @rank) AS rank,
                 @prev_income := @curr_income                                AS dummy
          FROM employee
          ORDER BY income DESC) AS t1
    WHERE t1.rank = (SELECT (COUNT(*) + 1) DIV 2 FROM employee)

    查询结果为:

    203ebad79cbd1463414c89cf3b5b959.png

    至此,我们找了两种方法来解决中位数的问题。撒花。

    推荐:《mysql教程

    以上就是在 MySQL 中,如何计算一组数据的中位数的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:learnku,如有侵犯,请联系admin@php.cn删除

    千万级数据并发解决方案(理论+实战):点击学习

    Mysql单表千万级数据量的查询优化与性能分析

    Mysql主从原理及其在高并发系统中的应用

    专题推荐:MySQL
    上一篇:MySQL 事务最全详解 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• mysql完整性约束详细介绍• MySQL常用操作及基础知识• php只能用mysql数据库吗• MySQL 事务最全详解
    1/1

    PHP中文网