百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> 在 MySQL 中,怎样盘算一组数据的中位数
分享文章到:

在 MySQL 中,怎样盘算一组数据的中位数

发布时间:09/01 来源:未知 浏览: 关键词:
要得到一组数据的中位数(例如某个地区或某家公司的收入中位数),我们一样要将这一任务细分为 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

完成小任务 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 中,怎样运算一组数据的中位数的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板