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

        在 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號
        主站蜘蛛池模板: 亚洲欧美日韩国产成人精品影院| 91精品国产福利在线观看| 三级国产精品| 欧美精品高清在线观看| 特级精品毛片免费观看| 日韩精品一区二区午夜成人版| 日韩精品久久久久久| 精品人妻人人做人人爽| 亚洲AV午夜福利精品一区二区| 欧美精品福利视频一区二区三区久久久精品 | 国产精品免费久久| 国产精品ⅴ无码大片在线看| 亚洲国产精品SSS在线观看AV| 人妻少妇精品无码专区动漫| 精品一区二区三区高清免费观看 | 午夜福利麻豆国产精品| 国产精品手机在线观看你懂的| 亚洲精品高清国产一久久| 精品日产一区二区三区手机| 国产成人亚洲精品青草天美| 精品国产AV一区二区三区| 日韩精品无码一本二本三本| 亚洲日韩一页精品发布| 亚洲精品宾馆在线精品酒店| 亚洲国产综合精品一区在线播放 | 久久亚洲精品视频| 国内精品免费在线观看 | 国产精品久久久久久一区二区三区| 国内精品伊人久久久久AV影院| 久久这里只有精品18| 久久精品人人做人人妻人人玩| 久久精品亚洲日本波多野结衣| 国精品午夜福利视频不卡麻豆| 国产精品白丝AV网站| 国产成人亚洲合集青青草原精品 | 一区二区三区精品高清视频免费在线播放 | 人妻少妇精品系列| 亚洲国产综合精品中文字幕| 最新欧美性爱精品一区二区三区 | 91精品国产91久久久久福利| 精品国产91久久久久久久|