用Mysql计算中位数
|
我在计算值列表的中位数而不是平均值时遇到了麻烦。
我发现这篇文章
用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
如果我有一个time
列,并且想要计算中位数,那么x
和y
列指的是什么?
没有找到相关结果
已邀请:
7 个回复
藐刚
和
是数据表的两个引用(您可以写
)。 编辑: 为避免两次计算总和,可以存储中间结果。
然后,您可以计算命名表中这些值的中位数。 编辑:临时表将无法在这里工作。您可以尝试使用具有\“ MEMORY \”表类型的常规表。或者只是让您的子查询在查询中两次计算中值。除此之外,我没有看到其他解决方案。这并不意味着没有更好的方法,也许其他人会想到一个主意。
乏摩纶誊伟
然后将中间值带入已排序的子查询中:
我使用5x10e6随机数数据集对此进行了测试,它将在10秒内找到中值。 通过将ѭ11替换为ѭ12将找到一个任意的百分位数,其中
是百分位数(中位数为.5,第75个百分位数为.75,等等)。
弓萍功
因此,要对日期进行排序,您需要一个数值;您可以获取其时间戳记(从纪元开始经过的秒数)并使用中位数的定义。
缮淳彼誊
说明: 通过group_concat函数内部的顺序进行排序 确定位置(pos)和元素总数(计数)。通过天花板确定位置可以帮助我们在以下步骤中使用substring_index函数。 基于计数,确定值的偶数或奇数。 奇数值:使用substring_index直接选择属于pos的元素。 偶数:找到属于pos和pos + 1的元素,然后将它们相加并除以2得到中位数。 最终计算出中位数。
宦哨抹存胳
的列名为
,并且想要A的中位数,则可以执行以下操作:
注意:仅当A中没有重复的值时,此方法才有效。而且,不允许使用空值。
芳菱挨啡
邪罗逢确胃
最初从此线程采用。