[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 쿼리를 통해 새로운 변수를 할당할 때는 유의할 것!
Author And Source
이 문제에 관하여([SQL Runday] HackerRank - Weather Observation Station 20), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@honeybeat1/SQL-Runday-HackerRank-Weather-Observation-Station-20저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)