如何在 MySQL 中計算中位數
Gustavo du Mortier
2023年1月30日
2020年11月24日
在本教程中,我們將展示幾種在 MySQL 中高效計算一系列數字的中位數的方法。
MySQL 沒有一個內建的函式來計算一系列數字的統計中位數。這就是為什麼,如果你需要計算中位數,你必須使用自定義程式碼來計算。
中位數是你要分析的一系列數字的中間元素。如果你使用大樣本,並且沒有有效地進行檢測,檢測這個元素可能是一個緩慢的過程。在某些情況下,這個過程也會很棘手。例如,一些演算法可能對奇數集有效,但對偶數集無效,反之亦然。
在 MySQL 中計算中位數的最準確方法
假設你有一個表 dataset
,其中有一列型別為 float 的 MyNumber
,你需要得到 MyNumber
資料系列的中位數。用一種在所有情況下都有效的演算法來計算中位數,最準確的方法是使用下面的指令碼。
SELECT AVG(mid_vals) AS 'median' FROM (
SELECT tab1.MyNumber AS 'mid_vals' FROM
(
SELECT @row:=@row+1 AS 'row', a.MyNumber
FROM dataset AS a, (SELECT @row:=0) AS r
ORDER BY a.MyNumber
) AS tab1,
(
SELECT COUNT(*) as 'count'
FROM dataset x
) AS tab2
WHERE tab1.row >= tab2.count/2 and tab1.row <= ((tab2.count/2) +1)) AS tab3;
如果表的行數較多,你需要在列 MyNumber
上建立一個索引,並確保該索引用於過濾和排序,以保證語句的良好執行。
使用 UDF(使用者自定義函式)為 MySQL 新增功能
數學和統計函式是非常常見的,如果你需要使用中位數等函式,你不應該重新發明輪子。因此,你可以抓住一個經過良好測試的使用者定義函式來完成這項工作。
在這個網站上,你會發現一堆你可以免費使用的 UDF 來為 MySQL 新增統計功能。其中一個 UDF 是 median
函式。它有一個輸入引數和一個輸出引數,型別都是 REAL
。輸入引數是包含計算中位數的一組數字的列,輸出引數是計算出的中位數。
下載好原始碼後,用這個命令新增 UDF。
CREATE AGGREGATE FUNCTION median RETURNS REAL SONAME 'udf_median.so';
然後,你可以在 SELECT
語句中使用這個函式,就像這樣:
SELECT MEDIAN(MyNumber) FROM dataset