
문제
https://school.programmers.co.kr/learn/courses/30/lessons/151139
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
- CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서
대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서
해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성 - 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬
- 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외
첫 번째 시도 (성공. 완성된 코드 맞나?)
- '특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외'를 어떻게 하지
SELECT MONTH(START_DATE) AS MONTH,
CAR_ID,
COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE >= '2022-08-01' AND START_DATE < '2022-11-01'
AND CAR_ID IN (SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE >= '2022-08-01' AND START_DATE < '2022-11-01'
GROUP BY CAR_ID
HAVING COUNT(*) >= 5)
GROUP BY MONTH(START_DATE), CAR_ID
ORDER BY MONTH(START_DATE), CAR_ID DESC
- GROUP BY로 인해 자동 충족되므로 '0건인 월 제외' 조건은 별도 처리할 필요 없음
- 완성된 코드는 맞지만, 코드 개선 필요
- 날짜 조건 중복 제거
개선된 코드 (CTE 사용)
WITH DATE_FILTER AS (SELECT *
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE >= '2022-08-01' AND START_DATE < '2022-11-01'),
RENTAL_HISTORY AS (SELECT CAR_ID
FROM DATE_FILTER
GROUP BY CAR_ID
HAVING COUNT(*) >= 5)
SELECT MONTH(START_DATE) AS MONTH,
CAR_ID,
COUNT(*) AS RECORDS
FROM DATE_FILTER
WHERE CAR_ID IN (SELECT CAR_ID FROM RENTAL_HISTORY)
GROUP BY MONTH(START_DATE), CAR_ID
ORDER BY MONTH, CAR_ID DESC
코드 설명
1. DATE_FILTER CTE
WITH DATE_FILTER AS (SELECT *
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE >= '2022-08-01' AND START_DATE < '2022-11-01')
- 전체 테이블에서 2022년 8월 1일부터 10월 31일까지의 대여 기록만 필터링
- 이 조건은 여러 번 쓰이기 때문에 공통 부분을 CTE로 분리하여 가독성과 재사용성 향상
2. RENTAL_HISTORY CTE
RENTAL_HISTORY AS (SELECT CAR_ID
FROM DATE_FILTER
GROUP BY CAR_ID
HAVING COUNT(*) >= 5)
- 위에서 필터링된 기록 중, 3개월간 대여 횟수가 5회 이상인 자동차 ID만 추출
- 조건에 맞는 자동차만 최종 결과에 포함되도록 하기 위한 목적
3. 최종 SELECT문
SELECT MONTH(START_DATE) AS MONTH,
CAR_ID,
COUNT(*) AS RECORDS
FROM DATE_FILTER
WHERE CAR_ID IN (SELECT CAR_ID FROM RENTAL_HISTORY)
GROUP BY MONTH(START_DATE), CAR_ID
ORDER BY MONTH, CAR_ID DESC
- DATE_FILTER에서 3개월간의 기록만 가져와, RENTAL_HISTORY에 포함된 CAR_ID만 선별
- MONTH(START_DATE)와 CAR_ID 기준으로 묶어 월별 대여 횟수 집계
- 정렬 기준은 월 오름차순, 자동차 ID 내림차순
'코딩 테스트 연습 > [프로그래머스][리트코드] MySQL' 카테고리의 다른 글
| [LV.5] SELECT > 오프라인/온라인 판매 데이터 통합하기 ⭐️ (2) | 2025.07.14 |
|---|---|
| [LV.5] JOIN > 그룹별 조건에 맞는 식당 목록 출력하기 ⭐️ (4) | 2025.07.11 |
| [LV.5] GROUP BY > 저자 별 카테고리 별 매출액 집계하기 (3) | 2025.07.09 |
| [LV.5] JOIN > 주문량이 많은 아이스크림들 조회하기 (2) | 2025.07.08 |
| [LV.5] String, Date > 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (1) | 2025.07.07 |