Если вы используете MySQL 8.0, это проще сделать с помощью оконных функций:
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)
Лог c выглядит следующим образом: сначала перечислим строки, упорядоченные по lat_n
. Если количество строк неравномерно, мы выбираем средний ряд; если оно четное, мы берем среднее значение двух средних значений.