문제
위도의 중위수를 구하는 문제입니다.
풀이 1 (노가다).
처음에 COUNT로 북위의 개수가 499개인 것을 확인
ROW_NUMBER를 통해 250번째에 있는 것이 중위수이므로 아래와 같은 쿼리 작성
하지만 이 풀이는 총 개수가 늘거나 줄어든다면 매번 숫자를 바꿔야한다는 번거로움이 존재
WITH MEDIAN AS(
SELECT LAT_N,
ROW_NUMBER() OVER(ORDER BY LAT_N ASC) AS RN
FROM STATION
)
SELECT ROUND(LAT_N, 4)
FROM MEDIAN
WHERE RN = 250;
풀이 2 (범용적인 풀이).
WITH구문에서 COUNT(*) OVER()로 각 행마다 전체 행의 개수를 출력하는 칼럼을 추가함 ( 그림의 3열 )
그리고 메인 쿼리를 보면
WHERE에서 (FLOOR((total_rows + 1) / 2), CEIL((total_rows + 1) / 2)) 이렇게 작성했는데
- FLOOR((total_rows + 1) / 2) : 만약 5라면 (5+1)/2 = 3이므로 최종값 3. 만약 6라면, (6+1)/2 = 3.5이므로 최종값 3.
- CEIL((total_rows + 1) / 2) : 만약 5라면 (5+1)/2 = 3이므로 최종값 3. 만약 6라면, (6+1)/2 = 3.5이므로 최종값 4.
짝수 개일때를 대비하여, 중앙값에 해당하는 2개의 수를 선택하게 만들어준다! (홀수 개일때도 포함)
SELECT에서 두 개의 선택된 수의 평균을 구한다면 짝수개일때의 중위수를 구하게 된다
WITH ordered_latitudes AS (
SELECT LAT_N,
ROW_NUMBER() OVER (ORDER BY LAT_N) AS row_num,
COUNT(*) OVER() AS total_rows
FROM STATION
)
SELECT ROUND(AVG(LAT_N), 4) AS median
FROM ordered_latitudes
WHERE row_num IN (FLOOR((total_rows + 1) / 2), CEIL((total_rows + 1) / 2));
'SQL > HackerRank' 카테고리의 다른 글
HackerRank | Draw The Triangle 1 (재귀적CTE) (0) | 2024.10.26 |
---|---|
HackerRank | Higher Than 75 Marks (0) | 2024.10.12 |
HackerRank | Draw The Triangle 2 (재귀적CTE) (0) | 2024.10.05 |
HackerRank | Occupations (sql에서 pivot하기) (1) | 2024.09.30 |