A median is defined as a number separating the higher half of a data set from the lower half. Query the median of the Northern Latitudes (LAT_N) from STATION and round your answer to decimal places.
주어진 LAT_N의 중앙값을 찾고, 소수점 4째자리까지 반올림하라
전체 개수가 짝수
n/2와 (n/2+1)의 평균
전체 개수가 홀수
(n+1)/2
row_number로 안될까? order by LAT_N desc 해버리고 rownum이랑 count(*)을 수정한 값이랑 비교하면 되지 않을까?는 아이디어로 아래와 같이 짜봤다
다만 이 코드는 percent_rank를 모르는 상황에서 작성한 코드로, 다소 길게 작성된 코드므로 아래 풀이 과정에 있는 코드를 보도록 하자 (...)
WITH tot_cnt AS (
SELECT
count(*) as 'tot'
FROM
STATION
),
rn AS (
SELECT
LAT_N
, ROW_NUMBER() OVER (ORDER BY LAT_N desc) as 'rownum'
FROM
STATION
)
SELECT
CASE
WHEN tot % 2 = 0 THEN ROUND(((SELECT LAT_N FROM rn WHERE rownum = tot/2) + (SELECT LAT_N FROM rn WHERE rownum = (tot/2)+1)) / 2, 4)
ELSE round((SELECT LAT_N FROM rn WHERE rownum = (tot+1)/2), 4)
END
FROM
tot_cnt
;
PERCENT_RANK()와 CUME_DIST() 함수
윈도우 함수인 PERCENT_RANK를 사용하면 파티션별로 누적 백분율을 구할 수 있다
다만 이번 문제의 경우 파티션을 나누지 않고 전체 그룹에 대해서 ORDER BY를 하고 PERCENT_RANK만 구하면 된다
SELECT
LAT_N
FROM (
SELECT
round(LAT_N, 4) as 'LAT_N'
, percent_rank() over (order by LAT_N desc) as 'pr'
FROM
station
) aa
WHERE pr = 0.5
;