Simple way to calculate median with MySQL
P粉720716934
2023-08-29 11:47:07
<p>What is the simplest (hopefully not too slow) way to calculate the median using MySQL? I'm using <code>AVG(x)</code> to find the mean, but I'm having trouble finding an easy way to calculate the median. Right now, I'm returning all the rows to PHP, sorting, and then selecting the middle rows, but there must be some easy way to do this in a single MySQL query. </p>
<p>Example data:</p>
<pre class="brush:php;toolbar:false;">id | val
--------
1 4
2 7
3 2
4 2
5 9
6 8
7 3</pre>
<p>Sort <code>val</code> gives <code>2 2 3 4 7 8 9</code>, so the median should be <code>4</code>, And <code>SELECT AVG(val)</code> == <code>5</code>. </p>
I just found another answer online一> in the comments:
Make sure your columns are well indexed and the indexes are used for filtering and sorting. Validate with explain plan.
Calculate the "median" row number. Maybe use:
median_row = Floor(count / 2)
.Then select it from the list:
This should return a row with the values you want.
In MariaDB/MySQL:
Steve Cohen pointed out that after the first pass, @rownum will contain the total number of rows. This can be used to determine the median, so no second pass or concatenation is required.
Additionally,
AVG(dd.val)
anddd.row_number IN(...)
are used to correctly generate the median when there is an even number of records. reasoning:Finally, MariaDB 10.3.3 includes MEDIAN functions