홍동이의 성장일기
[HackerRank] Weather Observation Station 20 본문
풀이 1
SELECT ROUND(AVG(lat_n), 4)
FROM (
SELECT lat_n
, PERCENT_RANK() OVER (ORDER BY lat_n) as p_rn
FROM station
) as t
WHERE p_rn = 0.5
풀이 2
SELECT ROUND(AVG(lat_n), 4)
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY lat_n) as row_num
, COUNT(*) OVER () as n
, lat_n
FROM station
) as t
WHERE CASE
WHEN MOD(n, 2) = 1 THEN row_num = (n+1)/2
ELSE row_num IN (n/2, (n/2)+1)
END
💡 문제풀이 (1)
SELECT lat_n
, PERCENT_RANK() OVER (ORDER BY lat_n) as p_rn
FROM station
PERCENT_RANK 함수를 사용하여 백분위에 대한 누적분포를 구해줍니다.
p_rn이 0.5에 위치한 행을 불러온 후 평균을 구해줍니다.
💡 문제풀이 (2)
SELECT ROW_NUMBER() OVER (ORDER BY lat_n) as row_num
, COUNT(*) OVER () as n
, lat_n
FROM station
lat_n에 대해 row_number와 행의 총 개수를 구해줍니다.
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY lat_n) as row_num
, COUNT(*) OVER () as n
, lat_n
FROM station
) as t
WHERE CASE
WHEN MOD(n, 2) = 1 THEN row_num = (n+1)/2
ELSE row_num IN (n/2, (n/2)+1)
END
중앙값의 위치를 구하는 식은 다음과 같습니다.
- 데이터가 짝수개일 경우: ((n / 2) + ((n / 2) + 1)) / 2
- 데이터가 홀수개일 경우: (n + 1) / 2
WHERE절에 CASE문을 사용하여 중앙값 위치에 있는 데이터를 반환해줍니다.
ROUND(AVG(lat_n), 4)
TEST DATA의 경우 데이터가 홀수개여서 하나만 반환되지만 데이터가 짝수개인 경우는 2개의 데이터가 반환됩니다.
따라서 도출된 행의 평균을 구해주고, 문제의 조건처럼 소수점 4자리까지 표현해줍니다.
📍본 내용은 '[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이'를 수강하며 작성한 내용입니다.
728x90
'Tool > SQL 코딩테스트 풀이' 카테고리의 다른 글
[LeetCode] 626. Exchange Seats (0) | 2023.10.15 |
---|---|
[LeetCode] 178. Rank Scores (0) | 2023.10.14 |
[HackerRank] Weather Observation Station 11 (0) | 2023.10.13 |
[HackerRank] Ollivander's Inventory (0) | 2023.10.12 |
[HackerRank] SQL Project Planning (1) | 2023.10.12 |
Comments