본문 바로가기
TIL - 프로그래밍/SQL

[해커랭크] Weather Observation Station 20 - MySQL

by chaemj97 2023. 7. 15.
728x90

https://www.hackerrank.com/challenges/weather-observation-station-20/problem?isFullScreen=true 

 

Weather Observation Station 20 | HackerRank

Query the median of Northern Latitudes in STATION and round to 4 decimal places.

www.hackerrank.com


  • 문제
    • LAT_N의 중앙값을 구하라

  • 풀이 1
    • 데이터의 개수가 홀수인지 짝수인지에 따라 중앙값을 구하는 방법이 다르다
      • 홀수인 경우
        • 중앙값의 위치는 (N+1)//2
      • 짝수인 경우
        • 중앙의 두 수의 평균 구하기
        • 두 수의 위치 : N//2, (N//2)+1

  • LAT_N의 순위 구하기
-- 순위, 데이터 총 개수, LAT_N
SELECT ROW_NUMBER() OVER (ORDER BY LAT_N) row_num
     , COUNT(*) OVER () n
     , LAT_N
FROM STATION;

해당 예제는 데이터의 개수가 홀수이므로 중앙값의 위치는 (499+1)//2 == 250이다. CASE문을 활용하여 정답 구하기

  • 코드 1
SELECT ROUND(AVG(LAT_N),4)
FROM (SELECT ROW_NUMBER() OVER (ORDER BY LAT_N) row_num -- 데이터 순위 매기기
           , COUNT(*) OVER () n -- 데이터의 총 개수
           , LAT_N
      FROM STATION) t
WHERE CASE 
          -- 데이터의 개수가 홀수인 경우
          WHEN MOD(n,2) = 1 THEN row_num = (n+1)/2
          -- 데이터의 개수가 짝수인 경우
          ELSE row_num IN (n/2,(n/2)+1)
      END;

 

  • 풀이 2 - 윈도우 함수
    • 윈도우 함수 중 PERCENT_RANK()
      • 등수 시작값 0, 마지막값 1
  • 코드 2
SELECT ROUND(AVG(LAT_N),4)
FROM (SELECT LAT_N
           , PERCENT_RANK() OVER (ORDER BY LAT_N) p_rn
      FROM STATION) t
WHERE p_rn = 0.5;
728x90
반응형

댓글