我想在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);
这不起作用,因为大多数内部查询首先运行。任何人都可以解决这个问题吗?
答案 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)