-
프로그래머스) 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 풀이 (MySQL)TIL-sparta 2024. 6. 22. 22:03
학습 키워드: MySQL, CAST, EXTRACT, MONTH
151139 - 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기
1) 문제 설명 요약 (원문은 링크 참고):
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
요약: 주어진 테이블 CAR_RENTAL_COMPANY_RENTAL_HISTORY에서 8~10월에 대여를 시작한 자동차들 중 총 대여 횟수가 5를 넘는 자동차들을 월별, 자동차 ID별로 묶어서 대여 횟수 RECORD를 함께 출력하는 문제다.
2) 풀이 과정:
일단 각 자동차들의 월별 대여 count를 구하기 전에 먼저 8~10월의 대여 시작 횟수가 5개 이상인 자동차의 목록을 알기 위한 subquery를 짜야한다.
# Sub-query SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE START_DATE >= 20220801 AND START_DATE < 20221101 GROUP BY CAR_ID HAVING COUNT(CAR_ID) >= 5
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 8~10월인 데이터를 CAR_ID로 묶어주고, HAVING 절에서 자동차 ID의 카운트가 5 이상인 경우만 골라준다. 이렇게 대상이 될 CAR_ID 목록을 얻어냈다면 다시 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 위의 sub-query에 속한 CAR_ID를 가지는 데이터들을 월별 대여 시작 기록의 수를 구분하여 골라줘야 한다.
3) 최종 query (정답):
SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(*) AS RECORDS FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE (CAR_ID) IN ( SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE START_DATE >= 20220801 AND START_DATE < 20221101 GROUP BY CAR_ID HAVING COUNT(CAR_ID) >= 5 ) AND START_DATE >= 20220801 AND START_DATE < 20221101 GROUP BY 1, 2 ORDER BY 1, 2 DESC
주의할 점은 서브 쿼리에서 골라준 것은 ID 뿐이기 때문에 바깥의 쿼리에서 똑같이 8~10월 기록으로 걸러주지 않으면 1~12월의 모든 기록을 대상으로 쿼리를 진행하게 된다.
4) 기타 사항:
# CAST(DATE_FORMAT(START_DATE, '%m') AS UNSIGNED) # EXTRACT(MONTH FROM START_DATE) # MONTH(START_DATE)
셋 모두 DATE 형식에서 월 정보를 Int 형식으로 뽑아낸다. EXTRACT의 경우 MONTH 외에도 다음과 같은 part 명을 이용해 DATE를 여러 형태로 추출할 수 있다.
MICROSECOND SECOND MINUTE HOUR DAY WEEK MONTH QUARTER YEAR SECOND_MICROSECOND MINUTE_MICROSECOND MINUTE_SECOND HOUR_MICROSECOND HOUR_SECOND HOUR_MINUTE DAY_MICROSECOND DAY_SECOND DAY_MINUTE DAY_HOUR YEAR_MONTH
테이블은 하나인데 조건이 한 번의 필터링을 거쳐야하고, WHERE절의 조건도 반복으로 적어줘야하는 것이 여태까지 겪어본 적이 없는 어딘가 깔끔하지 못하고 복잡하게 느껴지는 문제여서 오답을 많이 냈던 문제였다.
728x90'TIL-sparta' 카테고리의 다른 글
[TIL] 스파르타) Node.js 게임서버 주특기 플러스 1주차 강의 수강, 프로그래머스 - 오프라인/온라인 판매 데이터 통합하기 풀이 (MySQL) (0) 2024.06.24 프로그래머스) 그룹별 조건에 맞는 식당 출력하기 풀이 (MySQL) (0) 2024.06.23 [TIL] 타워 디펜스 팀 프로젝트 종료 (D-Day) (0) 2024.06.21 강의 과제) 응용 계층, DNS, HTTP (2) 2024.06.20 [TIL] 타워 디펜스 팀 프로젝트 진행 (D-2) (0) 2024.06.19