我有一张列有499个正数N的表格,我想找出这些数字的中位数,下面是:
SELECT (ROUND(N,4)) FROM TABLE ORDER BY N LIMIT 1 OFFSET ((COUNT(N)-1)/2);我得到以下错误:
第15行错误1064 (42000):您的SQL语法出现错误;请检查与MySQL服务器版本相对应的手册,以获得在第4行使用的正确语法“((计数(N)-1)/2)”
如果我将((COUNT(N)-1)/2)替换为249 (在表排序后中值为),这是可行的,因此我不能使用((COUNT(N)-1)/2)。为什么会这样呢?我该怎么做才能找到中位数呢?
谢谢
发布于 2017-10-24 10:52:07
唉,您不能在limit中包括表达式。您可以计算表中的行数,然后将其作为限制传递。
我通常会使用:
select avg(n)
from (select t.*, (@rn := @rn + 1) as rn
from (select t.*
from t
order by n
) t cross join
(select @rn := 0) params
) t
where 2 * rn in (@rn - 1, @rn, @rn + 1);备注:
order by混合。where同时适用于偶数行和奇数行。avg()取中间点。发布于 2017-10-24 10:18:16
这有点复杂,您需要创建一个与您的数据对齐的索引,并在捕获它之后
SELECT
*
FROM
(SELECT
t.*, @rownum:=@rownum + 1 AS rank
FROM
myTabel t, (SELECT @rownum:=0) r
ORDER BY ColumnToSort) AS B
WHERE
B.rank = (SELECT
ROUND(COUNT(*) / 2, 0)
FROM
myTable)基本上,您希望获得行号等于所选内容的一半的行号。MySql不支持任何返回此值的函数,因此您需要自己动手。在这里可以找到一个非常好的参考资料(MySQL - Get row number on select)
主要代码在这几行代码后面:
SELECT
t.*, @rownum:=@rownum + 1 AS rank
FROM
myTabel t, (SELECT @rownum:=0) r
ORDER BY ColumnToSorthttps://stackoverflow.com/questions/46907621
复制相似问题