본문 바로가기
데이터/SQL 문제풀이

HackerRank SQL - Weather Observation Station 20

by 찌노오 2023. 2. 24.

 

A median is defined as a number separating the higher half of a data set from the lower half. Query the median of the Northern Latitudes (LAT_N) from STATION and round your answer to 4 decimal places.

Input Format

The STATION table is described as follows:

where LAT_N is the northern latitude and LONG_W is the western longitude.

Problem

median(중위값)은 상위, 하위 절반을 구분한다. LAT_N의 중위값을 쿼리하라.

 


 

Answer1

SET @rownum:=-1;
SELECT ROUND(AVG(LAT_N),4)
FROM
    (SELECT @rownum:=@rownum+1 AS RowIdx, S.LAT_N
       FROM STATION S
    ORDER BY LAT_N) R
WHERE R.RowIdx IN (FLOOR(@rownum / 2), CEIL(@rownum / 2))

중위값은 다른 언어에서는 비교적 쉽게 추출할 수 있지만, MySQL에서는 조금 번거롭다는 걸 느꼈다. 심지어 Oracle은 median 내장함수도 있는데.....

 

 

 


How to solve

-1부터 시작하는 변수를 선언하고, 1씩 더해주는 구문을 만들어 각 행의 index를 부여한다.

-1을 초기 변수값으로 잡은 이유는 0부터 부여하기 위함이다. 

SET @rownum:=-1;

여기서 중위값의 개념을 다시 살펴보면,

변수의 양이 홀수개라면 딱 떨어지지만, 짝수개라면 중간에 위치한 2개의 값의 산술평균을 내야한다.

예시를 들어보면 변수가 11개라면 6번째 위치한 값이 중위값이 되고, 10이라면 5,6번째의 산술평균이 중위값이 되어야한다. 

 

WHERE절에서는 다음과 같이 쿼리를 작성한다.

rownum의 최대값(변수의 양)을 2로 나눠주는데 하나는 내림, 나머지는 올림으로 처리하여 정수로 만들어준다. 

WHERE R.RowIdx IN (FLOOR(@rownum / 2), CEIL(@rownum / 2))

 

마지막으로 WHERE절에 조건으로 걸어둔 두 값의 평균을 내면 중위값을 추출할 수 있다.

SET @rownum:=-1;
SELECT ROUND(AVG(LAT_N),4)
FROM
    (SELECT @rownum:=@rownum+1 AS RowIdx, S.LAT_N
       FROM STATION S
    ORDER BY LAT_N) R
WHERE R.RowIdx IN (FLOOR(@rownum / 2), CEIL(@rownum / 2))

 

 

 

 

 

반응형

댓글