首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查找中值

问SQL查找中值
EN

Stack Overflow用户
提问于 2017-10-24 10:02:44
回答 2查看 1.9K关注 0票数 0

我有一张列有499个正数N的表格,我想找出这些数字的中位数,下面是:

代码语言:javascript
复制
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)。为什么会这样呢?我该怎么做才能找到中位数呢?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2017-10-24 10:52:07

唉,您不能在limit中包括表达式。您可以计算表中的行数,然后将其作为限制传递。

我通常会使用:

代码语言:javascript
复制
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);

备注:

  • 在最新版本的MySQL中需要额外的子查询级别--参数并不总是与order by混合。
  • where同时适用于偶数行和奇数行。
  • 当行数为偶数时,avg()取中间点。
票数 1
EN

Stack Overflow用户

发布于 2017-10-24 10:18:16

这有点复杂,您需要创建一个与您的数据对齐的索引,并在捕获它之后

代码语言:javascript
复制
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)

主要代码在这几行代码后面:

代码语言:javascript
复制
SELECT 
    t.*, @rownum:=@rownum + 1 AS rank
FROM
    myTabel t, (SELECT @rownum:=0) r
ORDER BY ColumnToSort
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46907621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档