【问题标题】:SQL finding medianSQL查找中位数
【发布时间】:2018-04-05 01:54:35
【问题描述】:

我有一个包含 499 个正非整数 N 的列表,我想找到这些数字的中位数,我有以下内容:

SELECT (ROUND(N,4)) FROM TABLE ORDER BY N LIMIT 1 OFFSET ((COUNT(N)-1)/2);

我收到以下错误:

"ERROR 1064 (42000) at line 15: 你的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册 在第 4 行的 '((COUNT(N)-1)/2)' 附近使用正确的语法

如果我将 ((COUNT(N)-1)/2) 替换为 249 (其中中位数将在表格排序后),则此方法有效,因此我不能使用 ((COUNT(N)-1)/2)。为什么是这样?我应该用什么代替找到中位数?

谢谢

【问题讨论】:

标签: mysql sql median


【解决方案1】:

唉,你不能在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);

注意事项:

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

【讨论】:

    【解决方案2】:

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

    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 ColumnToSort
    

    【讨论】:

      猜你喜欢
      • 2018-12-25
      • 2015-02-11
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 2014-10-23
      • 2014-02-24
      • 2011-03-19
      • 2015-02-13
      相关资源
      最近更新 更多