1. ホーム
  2. sql

[解決済み】MySQLで中央値を計算する簡単な方法

2022-04-05 16:48:56

質問

MySQL で中央値を計算する最も簡単な(そしてできればあまり遅くない)方法は何ですか?私は AVG(x) 平均値を求めるには良いのですが、中央値を求める簡単な方法を見つけるのに苦労しています。今のところ、私はすべての行を PHP に返し、ソートを行い、そして中央の行を選んでいますが、きっと 1 つの MySQL クエリでそれを行う簡単な方法があるはずです。

データ例です。

id | val
--------
 1    4
 2    7
 3    2
 4    2
 5    9
 6    8
 7    3

でのソート val2 2 3 4 7 8 9 となるので、中央値は 4SELECT AVG(val) どの 5 .

解決方法は?

MariaDB / MySQLの場合。

SELECT AVG(dd.val) as median_val
FROM (
SELECT d.val, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum
  FROM data d, (SELECT @rownum:=0) r
  WHERE d.val is NOT NULL
  -- put some where clause here
  ORDER BY d.val
) as dd
WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) );

スティーブ・コーエン は、最初のパスの後、@rownum が行の総数を含んでいることを指摘しています。 これは中央値を決定するために使用されるため、2回目のパスや結合は必要ありません。

また AVG(dd.val)dd.row_number IN(...) は、レコード数が偶数である場合に中央値を正しく生成するために使用されます。 推論です。

SELECT FLOOR((3+1)/2),FLOOR((3+2)/2); -- when total_rows is 3, avg rows 2 and 2
SELECT FLOOR((4+1)/2),FLOOR((4+2)/2); -- when total_rows is 4, avg rows 2 and 3

最後に MariaDB 10.3.3+ には MEDIAN 関数が含まれています。