HackerRank의 SQL 문제를 풀다가 흥미로운 문제를 발견해서 포스팅한다. (문제 바로가기)
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.
번역하면, STATION 이라는 테이블의 가장 짧은 이름의 CITY와, 가장 긴 이름의 CITY를 구하라는 문제이다.
주의할 점은 혹시 CITY의 글자 수가 같은 경우, CITY를 알파벳순으로 놓았을 때 가장 먼저 오는 CITY를 선택하라고 한다.
먼저 주어진 STATION 테이블은 다음과 같이 생겼다.
문제가 이해되지 않을 경우를 대비해서 짧게 샘플 데이터로 설명도 해주고 있다.
간단히 설명해보자면, 예를 들어 DEF, ABC, PQRS, WXY 라는 4개의 값이 CITY에 있다고 하자.
각각의 글자 수는 3, 3, 4, 3이다.
여기서 가장 긴 글자는 PQRS이고, 이 때의 글자 수는 4이다.
하지만 가장 짧은 글자는 DEF, ABC, WXY가 모두 해당하고 글자 수는 3이다. → 이런 경우는 알파벳 순으로 정렬했을 때 가장 처음 오는 ABC를 선택하라는 뜻!
이렇게 해서 결과로는 다음과 같이 가장 짧은 글자와 가장 긴 글자와 그 때의 글자 수를 출력해야 한다.
ABC 3
PQRS 4
풀이
좀 어렵게 느껴질 수도 있지만, 생각해보면 간단하다.
나는 처음에 순위 함수인 RANK를 써서 글자 수별 순위를 매겨 출력하려고 했는데 그냥 ORDER BY를 적절히 이용하면 되는 문제였다.
먼저 글자 수를 세는 것은 LENGTH를 활용하면 된다.
LENGTH(CITY)의 값에 대해 정렬하고, 그 다음에 CITY를 알파벳순으로 정렬하면 된다.
가장 짧은 글자를 구할 땐 LENGTH(CITY)를 오름차순으로 정렬, 가장 긴 글자를 구할 땐 LEGNTH(CITY)를 내림차순으로 정렬하는 쿼리를 2개 만들면 끝!
SELECT CITY, LENGTH(CITY)
FROM STATION
ORDER BY 2, 1
LIMIT 1;
SELECT CITY, LENGTH(CITY)
FROM STATION
ORDER BY 2 DESC, 1
LIMIT 1;
'Skillset > SQL' 카테고리의 다른 글
SQL 중첩된 CASE WHEN 구문 활용: 삼각형의 타입 구분하기 (0) | 2022.08.09 |
---|---|
SQL 특정 문자들로 시작 or 끝나는 도시 출력하기 (0) | 2022.08.08 |
[MySQL] RECURSIVE 구문 활용해 배열 생성하기 예제 (feat. 빅쿼리 UNNEST) (0) | 2022.06.23 |
SQL N번째 순위 추출하기(2번째로 큰 값, 상위 N개, 하위 N개 구하기) (1) | 2022.06.14 |
[MS-SQL] 항목별 비율값 집계하기 (CAST, ROUND, CASE WHEN 구문) (0) | 2022.06.13 |