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(*)/2与COUNT(*)*n地方n是百分(.5位,0.75为第75百分位,等等).
val是你的时间列,x是y对数据表的两个引用(你可以写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”表类型的常规表。或者只是让子查询在查询中计算两次中位数的值。除此之外,我没有看到其他解决方案。这并不意味着没有更好的方法,也许其他人会提出一个想法。
| 归档时间: |
|
| 查看次数: |
20083 次 |
| 最近记录: |