728x90
www.hackerrank.com/challenges/weather-observation-station-20/problem
이 문제는 위도의 중간값을 구하는 문제입니다.
Oracle에서는 median이라는 함수를 사용해서 쉽게 구할 수 있지만 MySQL에서는 지원을 하지 않기 때문에 직접 구해야 합니다..ㅠ
중간값이란 데이터를 정렬했을 때 가운데 순번에 있는 숫자를 말합니다. (이때, 정렬 기준은 오름차순이던 내림차순이던 상관없습니다)
set @rownum = -1;
select round(avg(lat_n), 4) as median
from (select @rownum := @rownum +1 as rownum, lat_n
from station
order by lat_n) as s
where s.rownum in (floor(@rownum / 2), ceil(@rownum / 2));
저는 rownum이라는 변수를 만들어서 테이블 행을 세주는 방법을 사용했습니다.
변수를 -1로 초기화 한 이유는 데이터의 개수가 홀수/짝수에 따라 중간값을 구하는 방법이 다르기 때문입니다.
set @rownum = -1
select @rownum := @rownum +1 as rownum, lat_n
from station
order by lat_n
lat_n을 기준으로 오름차순 정렬을 해서 출력하면 아래와 같은 결과가 나옵니다.
조건에 맞는 숫자들을 가지고 평균값을 출력합니다!
여기서 s.rownum은 0~마지막 인덱스, @rownum은 마지막 인덱스 값으로 고정입니다.
홀수인 경우(rownum은 짝수)에는 floor던지 ceil이던지 똑같은 값이 나오기 때문에 한 가지 값으로 결과값을 조회하고,
짝수인 경우(rownum은 홀수)에는 조건을 만족하는 2개의 값을 가지고 평균을 구해서 결과값을 조회하게 됩니다.
set @rownum = -1;
select round(avg(lat_n), 4) as median
from (select @rownum := @rownum +1 as rownum, lat_n
from station
order by lat_n) as s
where s.rownum in (floor(@rownum / 2), ceil(@rownum / 2));
728x90
'Algorithms 🚀 > HackerRank' 카테고리의 다른 글
[해커랭크/SQL] Top Competitors (0) | 2021.05.09 |
---|---|
[해커랭크/SQL] New Companies (0) | 2021.05.09 |
[MySQL/해커랭크] The Report (0) | 2021.05.03 |
[MySQL/해커링크] Placements (0) | 2021.04.25 |
[MySQL/해커랭크] Symmetric Pairs (0) | 2021.04.25 |