HackerRank Weather Observation Station 20
중앙값(median)을 데이터 집합을 높은 절반과 낮은 절반으로 나누는 숫자로 정의할 때, STATION 테이블에서 LAT_N의 중앙값을 구하고, 결과를 소수점 4자리까지 반올림해서 출력하는 문제이다.
먼저 SUBQUERY를 사용해 전체 행 개수(N)와 각 행의 정렬 순서(ROW_NUM)를 가져왔다.
구체적으로, ROW_NUMBER() OVER(ORDER BY LAT_N ASC)로 LAT_N을 오름차순으로 정렬하고 각 행에 순번(ROW_NUM)을 부여했으며, COUNT(*) OVER()로 전체 행 개수(N)를 계산해 각 행에 부여했다.
이후 CASE 문을 활용해 홀수 개수일 때는 (N+1)/2번째 행, 짝수 개수일 때는 N/2 및 (N/2)+1번째 행을 선택하도록 했다.
마지막으로 AVG(LAT_N)으로 선택된 행의 평균을 계산하고, ROUND(..., 4)로 소수점 4자리까지 반올림해 출력했다.
SELECT
ROUND(AVG(LAT_N), 4)
FROM (
SELECT
LAT_N,
ROW_NUMBER() OVER(ORDER BY LAT_N ASC) AS ROW_NUM,
COUNT(*) OVER() AS N
FROM
STATION
) AS SUBQUERY
WHERE
CASE
WHEN N % 2 = 1 THEN ROW_NUM = (N + 1) / 2
ELSE ROW_NUM IN (N / 2, N / 2 + 1)
END;