使用Mysql中的行号查找mysql的中位数

时间:2016-06-16 12:59:50

标签: mysql

我想在MySQl中找到薪资值的中位数(考虑偶数的下半部分值)。表由

组成
Table Structure

ID
Salary 

由于没有rownum,我编写了以下代码以在Mysql中生成rownum。

set @r = 0;
Select 
    rownum, id, Salary
from
    (Select 
        @r:=@r + 1 as rownum, id, Salary
    from
        E
    order by Salary asc) p
where
    p.rownum = (Select 
            max(p.rownum)
        from
            p);

这不起作用,因为大多数内部查询首先运行。任何人都可以解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

您不能在子查询中使用在外部查询中创建的派生表。

您可以创建表格并使用它:

CREATE TABLE TMP_FOR_SELECT AS
Select @r:=@r+1 as rownum, id, Salary from E
order by Salary asc;

Select rownum, id, Salary
from TMP_FOR_SELECT p
where p.rownum = (Select max(t.rownum) from TMP_FOR_SELECT t);

编辑:对于工资中位数,请尝试以下方法:

set @r = 0;
Select rownum, id, Salary from
(Select @r:=@r+1 as rownum, id, Salary from E
order by Salary asc) p
where p.rownum = ROUND((Select COUNT(*) from e)/2);

答案 1 :(得分:1)

实际上,因为MySQL在外部查询之前处理子查询,所以你可以这样做:

Where p.rownum * 2 in (@r, @r + 1)

注意:您的问题不计算中位数。这是一种方法。

答案 2 :(得分:0)

由于在解决hacker rank问题求中位数时MySQL没有内置计算中位数的函数,我真的被卡住了,在搜索和理解concept of median时,我得到了用这个简单的方法来计算 MySQL 中的中位数

   with cal_median as (
select*,
    row_number() over(order by column_name ) as rn,
    count(*) over() as rc
    from table_name
) 
select column_name from cal_median 
where rn in((rc+1)/2 ,(rc+2)/2);
  • 这对奇数集和偶数集都有效

  • 如果您使用的是 Oracle,请使用内置函数

    从 table_name 中选择中位数(colum_name)