Einfache Möglichkeit, den Median in MySQL zu berechnen
P粉960525583
2023-08-20 18:05:23
<p>Was ist der einfachste (und hoffentlich nicht zu langsame) Weg, den Median mit MySQL zu berechnen? Ich habe <code>AVG(x)</code> verwendet, um den Mittelwert zu ermitteln, aber es fällt mir schwer, eine einfache Methode zur Berechnung des Medians zu finden. Derzeit gebe ich alle Zeilen an PHP zurück, sortiere sie und wähle dann die mittleren Zeilen aus, aber es muss eine einfache Möglichkeit geben, dies in einer einzigen MySQL-Abfrage zu tun. </p>
<p>Beispieldaten:</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>Sortieren nach <code>val</code> wir erhalten <code>2 2 3 4 7 8 9</code>, daher sollte der Median <code>4</code> sein, nicht < ;code>SELECT AVG(val)</code> ist gleich <code>5</code>. </p>
我刚刚在评论中找到了另一个在线答案:
确保你的列有良好的索引,并且索引被用于过滤和排序。通过执行计划进行验证。
计算“中位数”行号。可能使用:
median_row = floor(count / 2)
。然后从列表中选择出来:
这应该返回你想要的一个值。
在MariaDB / MySQL中:
Steve Cohen 指出,在第一次遍历之后,@rownum将包含总行数。这可以用于确定中位数,因此不需要第二次遍历或连接。
此外,
AVG(dd.val)
和dd.row_number IN(...)
用于在记录数为偶数时正确计算中位数。推理如下:最后,MariaDB 10.3.3+ 包含了MEDIAN函数