[SQL Runday] HackerRank - Weather Observation Station 20

LAT_N(북위) 칼럼의 Median(중앙값)을 구해라.
소숫점 5번째 자리에서 반올림 할것. (답은 소숫점 4자리)


Key Points

  • 이 문제는 SET 이라는 쿼리를 통해 새로운 변수를 정의하고, 파생 칼럼을 만들어야 함.
  • 중앙값은 row_index 칼럼의 마지막 값을 통해 구할 수 있다. LAT_N 기준으로 정렬한 뒤 0부터 시작하는 row_index 칼럼을 만들어보자.
SET @row_index = -1;
SELECT @row_index:=@row_index+1, --하나씩 +1 하는 값 지정
		LAT_N
FROM station
order by LAT_N

위의 쿼리를 실행하면 다음과 같은 값을 얻을 수 있다.

  • 이제 위의 결과값에서 행의 갯수가 499개이기 때문에, row_index가 250번째인 값을 조회하면 완료.
  • 총 행의 갯수(혹은 마지막 row_index 값)이 짝수, 홀수냐에 따라 중앙값이 달라진다.

마지막 row_index가 홀수인경우

전체 행이 짝수일때, 예를 들어 index가 0,1,2,3이라면 중앙값은 index가 1,2인 값의 평균이다. 마지막 index 3/2 = 1.5이므로 where절에 넣을 조건은 CEIL(row_index), FLOOR(row_index) - 올림, 내림 값의 평균이다.

마지막 row_index가 짝수인경우

전체 행이 홀수일때, 예를 들어 index가 0,1,2라면 중앙값은 index가 1인 row다. 마지막 index 2/2 = 1이므로 where절에 넣을 조건은 row_index/2 값이다. 그런데 1을 올림, 내림해도 1이므로 row_index가 홀수인경우에 맞춰서 쿼리를 해도 값이 달라지지 않는다. 따라서,,

최종 코드

set @rowindex = -1;
select round(AVG(LAT_N),4) from (
select @rowindex:=@rowindex+1 as row_index, LAT_N from station
order by LAT_N)row_table
where row_index in (ceil(@rowindex/2), floor(@rowindex/2))

Errors

  • where 조건에서 row_index를 지정할때, row_index와 @rowindex값은 다르다.
  • row_index는 LAT_N 칼럼 값처럼 한 행 한 행의 값처럼 다룰 수 있지만, @rowindex는 서브쿼리에서 +1을 쭉 했기때문에 마지막 행의 index값이다. 여기서는 그러므로 499.
  • 이 부분이 헷갈려서 계속 오류가 났는데, 다음부터 SET 쿼리를 통해 새로운 변수를 할당할 때는 유의할 것!

좋은 웹페이지 즐겨찾기