在 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?<p>查詢結果為:</p><p><img src="https://img.php.cn/upload/image/956/172/909/1568257541407392.png" title="1568257541407392.png" alt="492a81f0598eb5622f488d41ac30bdf.png"></p><p><strong>完成小任務 2</strong></p><p>找出中位數的排名數字:</p><pre class="brush:php;toolbar:false">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?<p>查詢結果為:</p><p><img src="https://img.php.cn/upload/image/381/982/318/1568257570637920.png" title="1568257570637920.png" alt="835e75d07d4ffd52a5482c8a08e89f3.png"></p><p>至此,我們就找到了如何從一組數據中獲得中位數的方法。</p><p><strong>方法二</strong></p><p>下面,來介紹另外一種優化排名語句的方法。</p><p>我們都知道如何給一組數據做排序操作,在本例中,實現方法如下:</p><pre class="brush:php;toolbar:false">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教程

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享