Weather Observation Station 20(hackerrank)

minllny·2024년 3월 10일


음.. 까다로운 문제인 것 같은데 어쩌다 정답이 되었어요 ㅋㅋㅋ
데이터가 홀수개일 때와 짝수개일 때 중앙값을 구하는 방법이 각각 다르다고 생각해서 그런 식으로 생각을 하다가 어려워서 일단 홀수개일 때만 적용되는 쿼리를 짜보자!해서 작성했는데 정답이 되었지 뭐에요 !

SELECT ROUND(LAT_N, 4)
FROM (
        SELECT ROW_NUMBER() OVER (ORDER BY LAT_N) ROW_N
             , ID
             , LAT_N
        FROM STATION
     ) AS T
WHERE ROW_N IN ( SELECT FLOOR(COUNT(ID)/2 + 1)
                 FROM STATION )


그리고 구글링 해보고 제가 생각하기에 이해가 잘 되었던 쿼리는 아래와 같습니다.

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;

MOD()함수는 처음 알았는데 % 계산과 같은 값을 줍니다. 또 WHERE절에서 CASE문을 사용할 수 있다는 것은 처음 알았어요.

이 문제에서 포인트는 ROW_NUMBER() 함수를 사용해서 순위를 지정해주고
데이터 갯수에 따라(홀수 or 짝수) 다른 알고리즘이 적용되어야하는 점인 것 같네요 ㅎ


MOD(n, m)

MOD(29, 9) -- 29/9의 나머지인 2가 출력
profile
SQL 끄적끄적

0개의 댓글