Попытка установить переменную в пределе, чтобы найти медиану - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь использовать mysql для решения следующих решений: https://www.hackerrank.com/challenges/weather-observation-station-20/problem

Понимание того, что переменная не может быть помещена в оператор LIMIT (из this )

Мой подход>

для объявления новой переменной для записи идентификаторов строк и использования 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;`

1 Ответ

0 голосов
/ 28 марта 2020

Если вы используете 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. Если количество строк неравномерно, мы выбираем средний ряд; если оно четное, мы берем среднее значение двух средних значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...