试图将变量置于极限以找到中位数
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
排序。如果行数不均匀,我们选择中间的行;如果是偶数,我们取中间两个值的平均值。
我尝试使用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
排序。如果行数不均匀,我们选择中间的行;如果是偶数,我们取中间两个值的平均值。