如何在 MySQL 中計算中位數

Gustavo du Mortier 2023年1月30日 2020年11月24日
  1. 在 MySQL 中計算中位數的最準確方法
  2. 使用 UDF(使用者自定義函式)為 MySQL 新增功能
如何在 MySQL 中計算中位數

在本教程中,我們將展示幾種在 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