코딩테스트/SQL

[프로그래머스][MySQL] Lv. 3 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

_알파카 2024. 7. 25. 19:35
728x90

문제 설명

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

 

프로그래머스

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

programmers.co.kr

 

문제에서 주어진 조건은 다음과 같다. 

1. 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지
2. 총 대여 횟수가 5회 이상인 자동차
3. 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS)
4. 월 기준 오름차순, 자동차 id 기준 내림차순, 0이면 제외

이를 기반으로 문제를 풀어보자. 

 

내 풀이

-- 기준일에 대하여 총 대여 횟수가 5회 이상인 자동차 뽑기
WITH w1 AS (
    SELECT CAR_ID, COUNT(CAR_ID)
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
    GROUP BY CAR_ID
    HAVING COUNT(CAR_ID) >= 5
)
-- 월별 자동차 ID별 총 대여 횟수 찾기
SELECT MONTH(h.START_DATE) AS MONTH
        , h.CAR_ID
        , COUNT(h.CAR_ID) AS RECORDS
FROM w1 INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY h
ON w1.CAR_ID = h.CAR_ID
WHERE h.START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY MONTH(h.START_DATE), CAR_ID
ORDER BY MONTH(h.START_DATE), CAR_ID DESC;

 

먼저, 기준일에 대하여 총 대여 횟수가 5회 이상인 자동차를 뽑는 서브쿼리를 정의한다. 

2022년 8월 1일부터 2022년 10월 31일까지 대여 시작일(START_DATE)을 기준으로

각 자동차의 대여 횟수를 계산한다. 

히우, 자동차 ID(CAR_ID)에 대하여 GROUP BY 를 진행하며,

이 때의 그룹화의 기준을 COUNT(CAR_ID)가 5회 이상인 것으로 그룹화한다! 

 

위의 서브쿼리에서 뽑은 자동차 ID를 기준으로 본 테이블(CAR_RENTAL_COMPANY_RENTAL_HISTORY)과 JOIN한다. 

주의할 점은 여기서도 대여 시작일을 명시해줘야 한다는 것이다. (이것을 명시하지 않아서 한참을 헤맸다)

-> 예를 들어 8~10월 사이에 5건 이상이 존재하고, 7월에도 대여건이 존재한다면, 7월에 해당하는 대여건까지 결과로 나오게 된다. 

더불어, GROUP BY를 활용해 월별 및 자동자ID 별로 그룹화를 하면 원하는 쿼리가 도출된다. 

 

 

다른 사람 풀이

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

 

내가 한 풀이와 매우 유사한 풀이이지만, CTE를 사용하지 않은 정답도 함께 남긴다. 

728x90