[HackerRank] Weather Observation Station 20

주연·2023년 5월 1일
0

SQL 문제 풀이

목록 보기
25/28
post-thumbnail

문제

https://www.hackerrank.com/challenges/weather-observation-station-20/problem

LAT_N의 중앙값을 소수점 4째자리까지 구하기

풀이

SELECT *
FROM (
SELECT LAT_N
    , ROW_NUMBER() OVER (ORDER BY LAT_N) r_num
    , COUNT(*) OVER () n
FROM STATION
) t
WHERE --?

못 푼 이유:
ROW_NUMBER줘서 2로 나누면 중앙값이고 COUNT함수를 이용해 홀수, 짝수 구분하면 되겠다! 까지는 생각났으나 WHERE절을 어떻게 해야할지 모르겠다;

  • 풀이 확인
SELECT ROUND(AVG(LAT_N), 4) --짝수일 때는 평균 이용
FROM (
SELECT LAT_N
    , ROW_NUMBER() OVER (ORDER BY LAT_N) r_num
    , COUNT(*) OVER () n
FROM STATION
) t
--where절에 case when 이용
WHERE CASE WHEN MOD(n,2) = 1 THEN r_num = (n+1)/2
           ELSE r_num IN (n/2, (n+1)/2)
      END

악 이렇게 하면 되는구나..담에 비슷한 문제 나오면 응용하자

  • 풀이 확인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 --중앙값
  • 풀이 확인3
SELECT ROUND(AVG(LAT_N), 4)
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY LAT_N) - 1 AS row_num --0부터
         , COUNT(*) OVER () - 1 AS row_total --0포함시켜서 1빼줌
         , LAT_N
    FROM Station
    ) t
WHERE row_num IN (FLOOR(row_total / 2), CEIL(row_total / 2))
profile
공부 기록

0개의 댓글