
음.. 까다로운 문제인 것 같은데 어쩌다 정답이 되었어요 ㅋㅋㅋ
데이터가 홀수개일 때와 짝수개일 때 중앙값을 구하는 방법이 각각 다르다고 생각해서 그런 식으로 생각을 하다가 어려워서 일단 홀수개일 때만 적용되는 쿼리를 짜보자!해서 작성했는데 정답이 되었지 뭐에요 !
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;
이 문제에서 포인트는 ROW_NUMBER() 함수를 사용해서 순위를 지정해주고
데이터 갯수에 따라(홀수 or 짝수) 다른 알고리즘이 적용되어야하는 점인 것 같네요 ㅎ
MOD(n, m)
MOD(29, 9) -- 29/9의 나머지인 2가 출력