코딩테스트/SQL
프로그래머스 - 대여 횟수가 많은 자동차들의 월별 대수 구하기
nandy
2023. 2. 19. 15:43
프로그래머스에서 제공하는 SQL 문제들 중 난이도가 Lv3 이상 문제들에 대한 해결과정을 아래와 같이 공유하고자 합니다.
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/151139
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제를 요약하자면, START_DATE(대여 시작일자) 가 2022년 8월부터 10월까지 총 대여횟수가 5회 이상인 CAR_ID 들 중에서 월별, CAR_ID 별로 대여 횟수를 구하는 문제다.
문제 자체는 어렵지 않았으나, join query 로 구성하는게 좋을지 subquery 로 구성하는게 좋을지 고민하다 우선 subquery 로 작성하는 것이 쿼리 이해가 더 쉬운거 같아서 아래와 같이 진행하였다.
subquery 예시
SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(1) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE(START_DATE) >= '2022-08-01' AND DATE(START_DATE) < '2022-11-01' AND CAR_ID IN (
SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE(START_DATE) >= '2022-08-01' AND DATE(START_DATE) < '2022-11-01'
GROUP BY CAR_ID
HAVING COUNT(1) >= 5
)
GROUP BY MONTH, CAR_ID
ORDER BY MONTH, CAR_ID DESC;
subquery 로 작성한 후에 동작하는 건 확인했지만 여전히 join query 로도 작성하는게 좋을 거 같아서
아래는 join 으로도 작성하였다.
join 예시
SELECT MONTH(START_DATE) AS MONTH, history.CAR_ID, COUNT(1) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY history
LEFT JOIN (
SELECT CAR_ID, COUNT(1) AS TOTAL FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE(START_DATE) >= '2022-08-01' AND DATE(START_DATE) < '2022-11-01'
GROUP BY CAR_ID
) summary ON history.CAR_ID = summary.CAR_ID
WHERE DATE(START_DATE) >= '2022-08-01' AND DATE(START_DATE) < '2022-11-01' AND TOTAL >= 5
GROUP BY MONTH, history.CAR_ID, TOTAL
ORDER BY MONTH, history.CAR_ID DESC;
left join 을 사용한 이유는 history 에서 count 에 영향을 주지 않고, WHERE 절에서 조건문만 설정하기 위해서 사용하였다.
여러 문제를 해결하면서 가장 중요한 점은 수학 문제도 하나의 문제를 여러 방식으로 푸는 것이 중요하듯,
프로그래밍 문제도 다양한 방식으로 푸는 것이 중요한 것 같다.