728x90
https://www.hackerrank.com/challenges/weather-observation-station-20/problem?isFullScreen=true
- 문제
- LAT_N의 중앙값을 구하라
- 풀이 1
- 데이터의 개수가 홀수인지 짝수인지에 따라 중앙값을 구하는 방법이 다르다
- 홀수인 경우
- 중앙값의 위치는 (N+1)//2
- 짝수인 경우
- 중앙의 두 수의 평균 구하기
- 두 수의 위치 : N//2, (N//2)+1
- 홀수인 경우
- 데이터의 개수가 홀수인지 짝수인지에 따라 중앙값을 구하는 방법이 다르다
- LAT_N의 순위 구하기
-- 순위, 데이터 총 개수, LAT_N
SELECT ROW_NUMBER() OVER (ORDER BY LAT_N) row_num
, COUNT(*) OVER () n
, LAT_N
FROM STATION;
해당 예제는 데이터의 개수가 홀수이므로 중앙값의 위치는 (499+1)//2 == 250이다. CASE문을 활용하여 정답 구하기
- 코드 1
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;
- 풀이 2 - 윈도우 함수
- 윈도우 함수 중 PERCENT_RANK()
- 등수 시작값 0, 마지막값 1
- 윈도우 함수 중 PERCENT_RANK()
- 코드 2
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;
728x90
반응형
'TIL - 프로그래밍 > SQL' 카테고리의 다른 글
[리트코드] 626. Exchange Seats - MySQL (0) | 2023.07.15 |
---|---|
[리트코드] 262. Trips and Users - MySQL (0) | 2023.07.15 |
[해커랭크] Ollivander's Inventory - MySQL (0) | 2023.07.14 |
[해커랭크] Occupations - MySQL (0) | 2023.07.11 |
[프로그래머스] LV4. 입양 시각 구하기(2) - MySQL (0) | 2023.07.11 |
댓글