반응형
www.hackerrank.com/challenges/weather-observation-station-20/problem
Weather Observation Station 20 | HackerRank
Query the median of Northern Latitudes in STATION and round to 4 decimal places.
www.hackerrank.com
해결 방법 : WHERE 절 서브쿼리끼리의 비교
- ORDER BY로 정렬된 메인 쿼리의 lat_n 기준, 현재 lat_n 보다 작은 lat_n와 큰 lat_n의 개수가 같다면 median이라고 할 수 있을 것이다.
SELECT convert(lat_n, decimal(65, 4))
FROM station as s1
WHERE (SELECT count(lat_n) FROM station WHERE lat_n < s1.lat_n ORDER BY lat_n)
= (SELECT count(lat_n) FROM station WHERE lat_n > s1.lat_n ORDER BY lat_n)
ORDER BY lat_n
문제를 통과하긴 했지만, 생각해보면 이 방법은 전체 데이터셋이 홀수일 때만 정상적으로 답이 나올 것이다.
(row가 2n개이면, 하나의 값을 기준으로 양쪽이 동등하게 나누어지지 않는다)
또한, 중앙값이 중복된 값이여도(물론 소수점을 포함한 위도가 같을 경우는 없겠지만..) 운이 좋지 않으면 답이 나오지 않는다. (ex. 1, 2, 3, 4, 4, 4, 5, 6)
따라서 위의 두 가지 경우를 모두 고려할 수 있도록 구현해보자.
- 짝수 case 해결 : lat_n 보다 작은 lat_n과 큰 lat_n의 개수의 차이가 0 또는 1인 경우를 찾고, (sum/count)로 만족하는 lat_n(들)의 평균을 구한다.
- 중복 case 해결 : 비교 연산에 '='를 포함시킨다.
SELECT convert(sum(lat_n)/count(lat_n), decimal(65, 4))
FROM station as s1
WHERE abs((SELECT count(lat_n) FROM station WHERE lat_n <= s1.lat_n ORDER BY lat_n)
- (SELECT count(lat_n) FROM station WHERE lat_n >= s1.lat_n ORDER BY lat_n)) <= 1
ORDER BY lat_n
반응형
'IT study > SQL' 카테고리의 다른 글
| Top Competitors (0) | 2021.04.26 |
|---|---|
| The Report (IF) (0) | 2021.04.26 |
| Weather Observation Station 18 ~ 19 (0) | 2021.04.23 |
| New Companies (+ 형 변환) (0) | 2021.04.22 |
| Binary Tree Nodes (0) | 2021.04.18 |