LV3. 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기
문제 )
CAR_RENTAL_COMPANY_RENTAL_HISTORY
테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.
# 8월~10월 까지 기간중 - 조건(1)
# 총 대여 횟수가 5회 이상 자동차들을 - 조건(2)
# 월별 자동차 ID 별 총 대여 횟수로 (컬럼명 : RECORDS)
# 월 오름차순, 자동차 ID 내림차순 - 조건(3)
SELECT MONTH, CAR_ID, RECORDS
FROM ( SELECT MONTH(START_DATE) AS MONTH
,CAR_ID
,COUNT(CAR_ID) as RECORDS
,SUM(COUNT(CAR_ID)) OVER(PARTITION BY CAR_ID) AS SUMRECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE start_date BETWEEN '2022-08-01 00:00:00' AND '2022-10-31 23:59:59' #(1)
GROUP BY MONTH, CAR_ID) A
WHERE SUMRECORDS >= 5 #(2)
ORDER BY MONTH, CAR_ID DESC #(3)
회고🤦♂️
이 문제의 핵심은 조건(2)를 어떻게 처리하느냐 인듯 합니다. 월(MONTH)별 그리고 자동차ID(CAR_ID)별로 자동차를 몇번 대여 했는지는 해당 컬럼을 GROUP BY 한후 COUNT(CAR_ID)를 이용해 구할 수 있습니다. 하지만 조건(2)를 만족하기 위해서는 "총 대여수"를 알아야 했기 때문에 저는 윈도우함수를 이용하여 CAR_ID를 파티션으로 나눈 뒤 SUMRECORDS 라는 일종의 필터를 만들었습니다. SUMRECORDS가 5 이상인 값들만 뽑은 뒤 조건에 맞는 컬럼들만 제출하면 정답입니다.
※ SUMRECORDS가 추가된 TABLE (일부) 입니다.
👉 예를들어, 28번 자동차는 8월에는 3번, 8월~10월 기간에는 총 5번 대여 되었다 라고 해석 할 수 있습니다.
MONTH | CAR_ID | RECORDS | SUMRECORDS |
---|---|---|---|
8 | 28 | 3 | 5 |
8 | 27 | 5 | 6 |
8 | 25 | 5 | 11 |
8 | 23 | 3 | 8 |
8 | 19 | 1 | 5 |
... |