[GROUP BY] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

2024. 9. 15. 18:00SQL 고득점 Kit/GROUP BY

https://school.programmers.co.kr/learn/courses/30/lessons/151139

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 설명
다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다.

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.

Column name Type Nullable
HISTORY_ID INTEGER FALSE
CAR_ID INTEGER FALSE
START_DATE DATE FALSE
END_DATE DATE FALSE

문제
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.


예시
예를 들어 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블이 다음과 같다면

HISTORY_ID CAR_ID START_DATE END_DATE
1 1 2022-07-27 2022-08-02
2 1 2022-08-03 2022-08-04
3 2 2022-08-05 2022-08-05
4 2 2022-08-09 2022-08-12
5 3 2022-09-16 2022-10-15
6 1 2022-08-24 2022-08-30
7 3 2022-10-16 2022-10-19
8 1 2022-09-03 2022-09-07
9 1 2022-09-18 2022-09-19
10 2 2022-09-08 2022-09-10
11 2 2022-10-16 2022-10-19
12 1 2022-09-29 2022-10-06
13 2 2022-10-30 2022-11-01
14 2 2022-11-05 2022-11-05
15 3 2022-11-11 2022-11-11


대여 시작일을 기준으로 총 대여 횟수가 5회 이상인 자동차는 자동차 ID가 1, 2인 자동차입니다. 월 별 자동차 ID별 총 대여 횟수를 구하고 월 오름차순, 자동차 ID 내림차순으로 정렬하면 다음과 같이 나와야 합니다.

MONTH CAR_ID RECORDS
8 2 2
8 1 2
9 2 1
9 1 3
10 2 2

대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지, 총 5회 이상 대여된 자동차들의 월별 총 대여횟수를 구하는 문제입니다.

 

이 문제는 서브쿼리를 사용해 5회 이상 대여된 자동차들의 자동차 ID를 구하고, 해당 ID와 월을 그룹으로 묶어 월별 총 대여횟수를 구하는 문제입니다.

제 기준으로 서브쿼리를 사용하지 않으면 조건을 나누는 게 불가능하기 때문에, 자동차 ID를 구하는 것은 서브쿼리로, 해당 자동차 ID에 따른 월별 횟수를 구하는 것은 메인쿼리로 진행했습니다.

 

WHERE 조건절에서 추가로 설정해야할 조건이 있는데, 바로 대여일자를 기준으로 2022년 8월부터 2022년 10월에 있는 자동차들만 대상으로 해야 합니다. 안 그러면 8, 9, 10월을 제외한 다른 월들의 데이터도 같이 출력되기 때문에, 테스트케이스에서는 통과하더라도 이후에는 통과하지 못합니다.

 

정답 코드를 작성해보겠습니다.

  SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(CAR_ID) AS RECORDS
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
   WHERE CAR_ID IN (SELECT CAR_ID
                      FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                     WHERE START_DATE >= '2022-08-01' 
                           AND START_DATE <= '2022-10-31'
                  GROUP BY CAR_ID
                    HAVING COUNT(CAR_ID) >= 5)
         AND START_DATE >= '2022-08-01' 
         AND START_DATE <= '2022-10-31'
GROUP BY MONTH(START_DATE), CAR_ID
ORDER BY 1 ASC, 2 DESC;

 

서술한 대로 2022년 8월부터 2022년 10월까지 5회 이상 대여된 차량의 자동차 ID를 구합니다.

이후, 마찬가지로 2022년 8월부터 2022년 10월까지의 월별 대여 횟수를 GROUP BY를 사용해 묶어 구해주었습니다.

ORDER BY에는 열이름 대신 숫자를 사용할 수 있는데요, 1은 1번째 열, 2는 2번째 열처럼 N은 N번째 열을 의미합니다.

이 코드는 1번째 열(월)을 기준으로 오름차순, 2번째 열(자동차 ID)을 기준으로 내림차순하도록 작성되었습니다.