SQL/문제풀이

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

응엉잉 2024. 1. 2. 11:18

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

 

프로그래머스

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

programmers.co.kr

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'
GROUP BY MONTH(start_date),
    car_id
HAVING COUNT(*) >= 5

이렇게 하면 각 월별로 5번 이상 빌린 차에 대해서만 나오기 때문에 오답이 된다.

 

8월부터 10월까지 car_id별 대여 건수를 출력하는 쿼리를 먼저 작성해보았다.

SELECT car_id,
    COUNT(*) AS cnt
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
ORDER BY cnt DESC

 

이 car_id 정보를 이용할 수 있는 방법이 있으면 될텐데 ...

WHERE절 서브쿼리를 사용해보았다.

 

정답 쿼리는 다음과 같다.

1. 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 차량의 car_id를 출력하는 쿼리문을 작성

 

2. WHERE + IN 을 사용해서 1번에서 작성한 서브쿼리의 car_id 리스트에 포함되는 car_id만 가져옴

 

3. 2022년 8월부터 2022년 10월까지의 데이터만 가져오기 위해 WHERE 절에 조건 추가

 

4. month와 car_id로 GROUP BY

 

5. COUNT(*) 를 사용해서 column의 개수를 세줌

 

6. 정렬 조건 작성

SELECT MONTH(start_date) AS month,
    car_id,
    COUNT(*) 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-11-01'
    GROUP BY car_id
    HAVING COUNT(*) >= 5
)
    AND start_date >= '2022-08-01'
    AND start_date < '2022-11-01'
GROUP BY MONTH(start_date),
    car_id
ORDER BY month, car_id DESC

 

어찌저찌 풀긴 했지만 좋은 풀이는 아닌것같다.

 

다른 사람들의 풀이를 찾아보았다!

https://hyul-mode.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%8C%80%EC%97%AC-%ED%9A%9F%EC%88%98%EA%B0%80-%EB%A7%8E%EC%9D%80-%EC%9E%90%EB%8F%99%EC%B0%A8%EB%93%A4%EC%9D%98-%EC%9B%94%EB%B3%84-%EB%8C%80%EC%97%AC-%ED%9A%9F%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0-Mysql

 

[프로그래머스] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (Mysql)

https://school.programmers.co.kr/learn/courses/30/lessons/151139 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞

hyul-mode.tistory.com

위 글을 참고하여 다시 작성해본 쿼리문은 다음과 같다.

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 MONTH(start_date) BETWEEN 8 AND 10
    GROUP BY car_id
    HAVING COUNT(car_id) >= 5
    )
	AND MONTH(start_date) BETWEEN 8 AND 10
GROUP BY month, car_id
HAVING records > 0
ORDER BY month,
	car_id DESC

 

전반적인 접근은 비슷한데,

이때 start_date의 월과 관련된 조건을 BETWEEN으로 깔끔하게 작성할 수 있다는걸 배웠다!