站長資訊網
        最全最豐富的資訊網站

        在 MySQL 中,如何計算一組數據的中位數

        要得到一組數據的中位數(例如某個地區或某家公司的收入中位數),我們一般要將這一任務細分為 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;

        查詢結果為:

        在 MySQL 中,如何計算一組數據的中位數

        完成小任務 2

        找出中位數的排名數字:

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

        查詢結果為:

        在 MySQL 中,如何計算一組數據的中位數

        完成小任務 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)

        查詢結果為:

        在 MySQL 中,如何計算一組數據的中位數

        至此,我們就找到了如何從一組數據中獲得中位數的方法。

        方法二

        下面,來介紹另外一種優化排名語句的方法。

        我們都知道如何給一組數據做排序操作,在本例中,實現方法如下:

        SELECT name, income FROM employee ORDER BY income DESC

        查詢結果為:

        在 MySQL 中,如何計算一組數據的中位數

        那我們可不可以更進一步,對查詢出的結果加一列,這一列的數據為排名呢?

        我們可以通過 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

        查詢結果如下:

        在 MySQL 中,如何計算一組數據的中位數

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

        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)

        查詢結果為:

        在 MySQL 中,如何計算一組數據的中位數

        至此,我們找了兩種方法來解決中位數的問題。撒花。

        推薦:《mysql教程》

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国产成人精品午夜福麻豆| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 亚洲精品永久在线观看| 亚洲日韩精品欧美一区二区| 精品人妻va出轨中文字幕| 亚洲精品永久在线观看| 国产一级精品高清一级毛片| 久久亚洲国产欧洲精品一| 国产精品视频永久免费播放| 午夜精品久久久久久久| 亚洲精品国产V片在线观看| 精品乱码久久久久久夜夜嗨| 99久久人人爽亚洲精品美女| 1000部精品久久久久久久久 | 国产国拍亚洲精品mv在线观看 | 精品无码人妻久久久久久| 精品久久香蕉国产线看观看亚洲| 国精品无码一区二区三区在线| 人妻少妇精品无码专区二区| 在线精品自拍无码| 亚洲av午夜国产精品无码中文字| 精品乱子伦一区二区三区| 国产精品国产三级国产潘金莲| 在线精品国产一区二区| 欧美日韩在线亚洲国产精品| 99久久国产热无码精品免费 | 无码人妻精品一区二区在线视频| 全国精品一区二区在线观看| 国产精品无码免费专区午夜| 国产精品国产欧美综合一区 | 91国内外精品自在线播放| 久久精品国产亚洲AV香蕉| 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 精品国产AV一区二区三区| 亚洲AV永久无码精品| 亚洲2022国产成人精品无码区| 日韩精品无码一区二区三区不卡 | 亚洲国产精品热久久| 亚洲国产精品久久久久婷婷软件| 99久久99久久精品国产| jizz国产精品|