Heim  >  Fragen und Antworten  >  Hauptteil

Einfache Möglichkeit, den Median in MySQL zu berechnen

<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>
P粉960525583P粉960525583426 Tage vor591

Antworte allen(2)Ich werde antworten

  • P粉738248522

    P粉7382485222023-08-21 16:20:51

    我刚刚在评论中找到了另一个在线答案:

    确保你的列有良好的索引,并且索引被用于过滤和排序。通过执行计划进行验证。

    select count(*) from table --找到行数

    计算“中位数”行号。可能使用:median_row = floor(count / 2)

    然后从列表中选择出来:

    select val from table order by val asc limit median_row,1

    这应该返回你想要的一个值。

    Antwort
    0
  • P粉195200437

    P粉1952004372023-08-21 13:39:20

    在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
      -- 在这里放置一些条件语句
      ORDER BY d.val
    ) as dd
    WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) );

    Steve Cohen 指出,在第一次遍历之后,@rownum将包含总行数。这可以用于确定中位数,因此不需要第二次遍历或连接。

    此外,AVG(dd.val)dd.row_number IN(...)用于在记录数为偶数时正确计算中位数。推理如下:

    SELECT FLOOR((3+1)/2),FLOOR((3+2)/2); -- 当total_rows为3时,平均行数为2和2
    SELECT FLOOR((4+1)/2),FLOOR((4+2)/2); -- 当total_rows为4时,平均行数为2和3

    最后,MariaDB 10.3.3+ 包含了MEDIAN函数

    Antwort
    0
  • StornierenAntwort