[코드카타] SQL 170번 Weather Observation Station 20

양승우·2024년 11월 14일

코드카타

목록 보기
39/58
  1. Weather Observation Station 20

문제

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
;
profile
어제보다 오늘 더

0개의 댓글