试图将变量置于极限以找到中位数

Trying to put a variable into limit to find a median

我尝试使用mysql来解决以下解决方案: https://www.hackerrank.com/challenges/weather-observation-station-20/problem

了解不能将变量放入 LIMIT 语句(来自 this

我的做法>

声明一个新的变量来记录rowIDs,并使用rowID来检索中间的记录。 但是,rowID 似乎运行不正常。 谁能给我一些建议?

SELECT ROUND(COUNT(LAT_N)/2,0) FROM STATION into @count;
SELECT ROUND(a.LAT_N,4) FROM (
SELECT *,@row := @row + 1 FROM STATION s, (SELECT @row := 0) r
    WHERE @row <=@count
    ORDER BY s.LAT_N ASC) a
ORDER BY a.LAT_N DESC  LIMIT 1;`

如果您是 运行 MySQL 8.0,使用 window 函数可以更简单:

select round(avg(lat_n), 4) median_lat_n
from (
    select s.*, row_number() over(orer by lat_n) rn
    from station s
    where lat_n is not null
) s
where rn * 2 in (rn - 1, rn, rn + 1)

在早期版本中,变量让它变得有点棘手;我们需要多一层嵌套以使其安全:

select round(avg(lat_n), 2) median_lat_n
from (
    select s.*, @rn := @rn + 1 rn
    from (select * from station order by lat_n) s
    cross join (select @rn := 0) p
) s
where rn  * 2 in (rn - 1, rn, rn + 1)

逻辑如下:先枚举行,按lat_n排序。如果行数不均匀,我们选择中间的行;如果是偶数,我们取中间两个值的平均值。