본문 바로가기
SQL

[HackerRank] Weather Observation Station 5: row_number, length

by jnhn 2024. 5. 28.

문제:

Query the two cities in STATION with the shortest and longest CITY names, as well as their respective lengths (i.e.: number of characters in the name). If there is more than one smallest or largest city, choose the one that comes first when ordered alphabetically.
The STATION table is described as follows:

해석하자면, 스테이션 테이블에서 문자열의 길이가 가장 긴 도시명과 문자열의 길이 그리고 가장 문자열의 길이가 짧은 도시명과 문자열의 길이를 구하는 문제

정답

select  city, len
from(select city, 
            length(city) as len, 
            row_number() over(order by length(city) desc, city asc) as r_max, # 긴문자열기준
            row_number() over(order by length(city) asc, city asc) as r_min # 짧은문자열기준
         	  from station) a
 where a.r_max ='1' or a.r_min = '1' ;

풀이

row_number을 활용하여 풀었다. 어려운 문제는 아닌데 mysql로 order by ~ limit 이렇게 맨처음 혹은 맨 마지막의 데이터를 가지고오는 건 익숙했는데 맨앞과 맨끝을 어떻게 가져오지 처음 해보는 접근방식이라 살짝 당황했다. union을 쓰자니 내 자존심이 허락하지 않아, 실무에서는 한 번도 안써본 row_number 함수를 활용해보았다. 오랜만에 쓰려니 문법도 까먹어버렸다. 이렇게 복습하는거지~ row_number(order by ~)로 각각 긴문자열, 짧은 문자열 기준으로 r_max, r_min컬럼을 만들어 각각 1위를 가지고 오는 식으로 풀이했다.