본문 바로가기
Analysis/SQL

[MySQL] HackerRank - Weather Observation Station 18-20

by da.zeegoo 2023. 8. 12.

Table 'STATION' 

Field Type Note
ID NUMBER  
CITY VARCHAR2 (21) Cities in USA
STATE VARCHAR2 (2) States in USA
LAT_N NUMBER Northern Latitude
LONG_W NUMBER Western Longitude

- Weather Observation Station 18, 19, 20

- SubDomain: Aggregation

- Skills: SQL Basic, SQL Intermediate

 


Question 18

 

Answer

SELECT ROUND(ABS(MIN(lat_n)-MAX(lat_n)) + ABS(MIN(long_w)-MAX(long_w)),4)
FROM station;

 


 

Question 19

Answer

SELECT ROUND(POW(POW(MAX(lat_n)-MIN(lat_n),2)+POW(MAX(long_w)-MIN(long_w),2),0.5),4)
FROM station;

 

 


 

Question 20

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 4 decimal places.

→ Median 함수가 없는 MySQL에서 lat_n 변수의 중간값 구하기

 

Answer

SET @rowIndex = -1;

WITH ordered_stat AS (
    SELECT @rowIndex := @rowIndex+1 AS row_num, lat_n
    FROM station
    ORDER BY lat_n
)

SELECT ROUND(AVG(lat_n),4)
FROM ordered_stat
WHERE row_num IN (FLOOR(@rowIndex/2),CEIL(@rowIndex/2));

Memo

지역변수 설정
- 지역변수 설정은 언제나 어렵다
- SET 이용 후 쿼리문 닫아주기 (;)
- 지역변수 최종 결과물 (@rowIndex) 잘 활용하기
- ROW_NUMBER () OVER (ORDER BY _ ) 사용하지 않은 이유는 인덱스를 0부터 시작하기 위해서

 

 

SELECT ROUND(S.LAT_N,4) medium 
FROM station S
WHERE (SELECT COUNT(lat_n) FROM station WHERE Lat_N < S.LAT_N ) = (SELECT COUNT(lat_n) FROM station WHERE Lat_N > S.LAT_N);

 

 

Memo

더 간단한 쿼리문은 없을까 고민하다가..
-  중간값은 아래 위로 정확히 같은 수의 데이터셋을 나눈다는 질문을 그대로 적용한 쿼리문 발견
- STATION 데이터를 두 번 호출
- 처음 호출한 STATION을 기준으로 '두번째로 호출한 STATION이 같은 수의 데이터셋으로 나뉘는 지점'을 WHERE 구문으로 지정

 

 

 

 

 

질문과 조언은 언제나 환영입니다!

댓글