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
악 이렇게 하면 되는구나..담에 비슷한 문제 나오면 응용하자
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 --중앙값
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))