用Mysql计算中位数

Tim*_*Tim 7 mysql statistics median

我在计算值列表的中位数时遇到问题,而不是平均值.

我发现这篇文章 用MySQL计算中位数的简单方法

它引用了以下我不理解的查询.

SELECT x.val from data x,data y GROUP BY x.val HAVING SUM(SIGN(1-SIGN(y.val-x.val)))=(COUNT(*)+ 1)/ 2

如果我有时间列并且我想计算中值,那么x和y列是指什么?

小智 10

我提出了一个更快的方法.

获取行数:

SELECT CEIL(COUNT(*)/2) FROM data;

然后在排序的子查询中取中间值:

SELECT max(val) FROM (SELECT val FROM data ORDER BY val limit @middlevalue) x;

我使用随机数的5x10e6数据集对此进行了测试,它将在10秒内找到中位数.

这将通过更换找到任意百分位COUNT(*)/2COUNT(*)*n地方n是百分(.5位,0.75为第75百分位,等等).

  • 很好的解决方案,但如果有奇数项,你应该得到两个中间点的平均值`SELECT avg(val)FROM(SELECT val FROM data ORDER BY val limit @middlevalue,@ numvalues)x;`where @numvalues是`(@middlevalue mod 2)+ 1` (4认同)

Kra*_*rab 2

val是你的时间列,xy对数据表的两个引用(你可以写data AS x, data AS y)。

编辑:为了避免计算两次总和,您可以存储中间结果。

CREATE TEMPORARY TABLE average_user_total_time 
      (SELECT SUM(time) AS time_taken 
            FROM scores 
            WHERE created_at >= '2010-10-10' 
                    and created_at <= '2010-11-11' 
            GROUP BY user_id);
Run Code Online (Sandbox Code Playgroud)

然后,您可以计算命名表中这些值的中位数。

编辑:临时表在这里不起作用。您可以尝试使用“MEMORY”表类型的常规表。或者只是让子查询在查询中计算两次中位数的值。除此之外,我没有看到其他解决方案。这并不意味着没有更好的方法,也许其他人会提出一个想法。