일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 시계열데이터셋
- 빈 데이터프레임 #pandas #데이터전처리
- 파이프라인전처리
- 짧은 시계열 # 금융시계열
- np.split
- 시계열모듈
- pandas # 월말 날짜 # 마지막 주 # 날짜계산 # 시계열 # 마지막 주 금요일
- 날짜파싱
- 시계열시각화
- 시계열 #reindex #인덱스 확장 #datetime index #index extention # 데이터전처리
- 응용이 보이는 선형대수
- adf_test
- 확률
- pandas
- 시계열
- SQL
- 플로틀리
- 크롤링자동화
- 시계열분해
- 시간형식
- 음수값 #전처리 #선형보간 #pandas #데이터 #데이터분석
- loess
- timeseries decomposition
- 오제이튜브
- 이수역 양식집
- 시간형식변환
- stl
- Python
- seaborn # kdeplot # 데이터분석
- 리눅스개념
- Today
- Total
먼지뭉치 Data Analysis
[HackerRank] Weather Observation Station20: Median(중앙값) 구하기 본문
안녕하세요 오늘도 계속해서 HackerRank 문제를 정리해보도록 하겠습니다.
이번에 푼 문제는 Weather Observation Station 20이라는 문제였고요.
결국 Median(중앙값)을 구하는 문제였습니다.
파이썬으로는 간단하게 구할 수 있는 값을 쿼리로 구하려다 보니 상당히 많이 헷갈렸네요.
Q. LAT_N 값의 Median 값을 소수점 4째자리까지 반올림하여 나타내시오.
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.
Input Format
The STATION table is described as follows:

첫시도.
중앙값의 경우 데이터를 정렬했을 때 가장 가운데 있는 값이므로
전체 행의 개수를 n이라고 할때,
n= 홀수일땐 : y(n/2),
n= 짝수일땐 : y((n/2) - 1), y((n/2) + 1) 의 평균
이므로 어떻게 하면 함수값처럼 Lat_n값을 추출할 수 있을 지 고민했고 데이터 정렬로 행 번호가 필요하겠단 생각이 들었습니다.
그리고 전체 행 번호가 필요하겠구나 싶어 윈도우 함수를 사용해 하나의 CTE를 만든 결과입니다.
# 첫시도
WITH ORDERED_DATA AS (
SELECT LAT_N,
ROW_NUMBER() OVER (ORDER BY LAT_N) AS ROW_NUM,
COUNT(*) OVER () AS TOTAL_ROWS
FROM STATION
)
SELECT * FROM ORDERED_DATA

Lat_n 값 오름차순으로 행번호랑 총 행수를 출력하였습니다.
하지만, 특정행의 값을 어떻게 추출하는지를 도저히 모르겠었고 그 다음 단계로 넘어가기 어려웠습니다.
Solution.
(step1) 짝수, 홀수 2가지 경우 한번에 조건 걸어주기
결국 where 조건 절에 특정 행 번호를 넣어줘야 하는 것이지만
홀수일 땐 y(n/2), 짝수일 땐 y((n/2) - 1), y((n/2) + 1)를 한번에 표현하는 부분이 어려웠습니다.
홀수일땐 값이 1개, 짝수일땐 2개가 나와야 하니.. 막막했네요.
WITH ORDERED_DATA AS (
SELECT LAT_N,
ROW_NUMBER() OVER (ORDER BY LAT_N) AS ROW_NUM,
COUNT(*) OVER () AS TOTAL_ROWS
FROM STATION
),
MEDIAN_CALC AS (
SELECT LAT_N,
TOTAL_ROWS,
ROW_NUM
FROM ORDERED_DATA
WHERE ROW_NUM = FLOOR((TOTAL_ROWS+1)/2)
OR ROW_NUM = CEIL((TOTAL_ROWS+1)/2)
)
WHERE ROW_NUM = FLOOR((TOTAL_ROWS+1)/2)
OR ROW_NUM = CEIL((TOTAL_ROWS+1)/2)
where절에 or을 써서 2가지 값이지만 홀수일 땐 2개의 값이 같아서 1개의 값이, 짝수일 땐 2개의 값이 나오게 됩니다.
하나의 스킬적인 부분인 것 같네요.
(step2) 짝수, 홀수일 때 case when으로 median값 구하기
#전체 정답 쿼리
WITH ORDERED_DATA AS (
SELECT LAT_N,
ROW_NUMBER() OVER (ORDER BY LAT_N) AS ROW_NUM,
COUNT(*) OVER () AS TOTAL_ROWS
FROM STATION
),
MEDIAN_CALC AS (
SELECT LAT_N,
TOTAL_ROWS,
ROW_NUM
FROM ORDERED_DATA
WHERE ROW_NUM = FLOOR((TOTAL_ROWS+1)/2)
OR ROW_NUM = CEIL((TOTAL_ROWS+1)/2)
)
SELECT
CASE
WHEN MAX(TOTAL_ROWS)%2=1 THEN ROUND(MAX(LAT_N),4)
ELSE ROUND(AVG(LAT_N),4)
END AS MEDIAN_VALUE
FROM MEDIAN_CALC;
case when으로 행의 전체 개수가 짝수일때, 홀수일때를 나눠 median을 계산해준 쿼리입니다.
파이썬과 다르게 total_row%2 == 1이 아닌, sql은 total_row%2 = 1 이라는 점 주의해주시면 좋을 것 같습니다.

* CTE를 2개를 만들면 된다는 점
* 짝수, 홀수 일때 where절 스킬적인 부분
등등을 알게 된 것 같습니다.
계속해서 sql문제들을 정리해보도록 하겠습니다. 감사합니다!
'SQL' 카테고리의 다른 글
[HackerRank] Occupations 직업별 피벗 테이블 만들기 (0) | 2025.03.19 |
---|---|
[HackerRank] The PADS 안됐던 이유 정리 (0) | 2025.03.14 |
[HackerRank SQL] Draw The Triangle 별 삼각형 그리 (0) | 2025.03.06 |
SQL 회원가입 후 로그인까지 소요된 평균일 수 구하기 (1) | 2025.02.04 |