[MS-SQL] HackerRank - Weather Observation Station 20

Grara·2023년 4월 29일
0

개요

풀이

  • MS-SQL은 중간값을 구해주는 함수가 따라 없어서 직접 구현을 해줘야함
  • 전체 행수가 홀수인 1개의 케이스밖에 없어서 홀수인 경우에만 적용되는 쿼리문을 짜도 통과할 수는 있긴함
  • 홀수인 경우와 짝수인 경우를 나눠서 WHERE문에서 조건처리를 해줌
SELECT CAST(ROUND(AVG(LAT_N), 4) AS NUMERIC(10,4)) AS MEDIAN --중간값 평균을 구하고 소수점 5번째에서 반올림하고 나머지는 짜름
FROM   
       (SELECT LAT_N
             , ROW_NUMBER() OVER(ORDER BY LAT_N) AS ROW_NUM
             , COUNT(*) OVER() AS CNT
        FROM   STATION) AS SUB

WHERE  CASE --전체 행수에 따라 분기처리
            WHEN CNT % 2 = 1 AND ROW_NUM = (CNT + 1) / 2 --전체 행수가 홀수일 경우 가운데 하나만
            THEN 1
            WHEN CNT % 2 = 0 AND (ROW_NUM = (CNT / 2) OR ROW_NUM = (CNT / 2) + 1) --전체 행수가 짝수일 경우 (전체행수 / 2)와 {(전체행수/2) + 1} 인 행을 구해야함
            THEN 1
       END = 1
  • 위와같이 풀었는데 다른사람이 한걸 찾아보니 더 깔끔한 방법이 있었다.
  • 링크 : https://yurimyurim.tistory.com/14
  • 다만 이 사람의 경우는 Oracle을 사용, MS-SQL도 크게 다르지는 않을 것 같다.
SELECT ROUND(AVG(LAT_N), 4) MEDIAN
  FROM (SELECT LAT_N
             , ROW_NUMBER() OVER(ORDER BY LAT_N) RN
             , COUNT(1) OVER() + 1 CNT
          FROM STATION
       )
 WHERE RN BETWEEN FLOOR(CNT / 2) AND CEIL(CNT / 2)
profile
가보자고

0개의 댓글