해당 문제는 Programmers에서 사용한 문제이며 모든 테이블의 자료와 출처는 Programmers임을 밝힙니다.
해당 글에서는 서브쿼리와 GROUP BY를 이용하여 푸는 문제로 초보자가 하기에는 보통~어려움 정도의 난이도를 가지고 있습니다.
해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.
시작하겠습니다.
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.
여기서 알아야 할 것은 2022-08 ~ 2022-10 까지의 총 대여 횟수가 5회 이상이여야 하는 것이 전제조건입니다.. 그리고 대여한 총 횟수를 넣는 것이 아닌 각각의 월에 해당 자동차를 대여한 횟수를 출력해야 하는 것입니다.(저는 계속 총 횟수를 넣는 바람에 시간을 많이 지체 하였습니다.)
즉, 간단하게 5회 이상 대여한 CAR_ID를 가져오고 조건문에 해당 CAR_ID를 넣어준 후 각각의 월에 빌린 카운트 수를 세어 주면 될 것 같습니다.
1. 조건에 맞는 CAR_ID 추출하기
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
DATE_FORMAT을 쓰는 방법도 있으나 저는 이번에는 굳이 사용할 필요가 없다 생각 되어 직관적인 BETWEEN AND를 사용했습니다.
CAR_ID를 그룹으로 묶고 HAVING절을 사용하여 해당 CAR_ID의 카운트가 5개 이상인 값들만 추출하도록 만들어 주었습니다.
위의 코드 결과와 같이 5번 이상 대여한 자동차 목록들이 출력되었습니다. 이제 저희는 해당 CAR_ID만 이용하면 되는 것입니다.
2. WHERE 절에 추가하고 값 확인 하기
SELECT MONTH(START_DATE) AS MONTH
, CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE
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)
AND START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
우선 맨 아래에 날짜 조건을 추가해준 이유는 WHERE절에서의 서브 쿼리에서 날짜 조건을 추가하여 CAR_ID를 가져오긴 하였으나, 해당 CAR_ID를 날짜조건을 추가해주지 않으면 11월 달에 대여한 CAR_ID가 있게 되면 그 값도 들어가게 되기 때문에 해당 조건을 추가해준 것입니다.
이렇게 해주면 각각의 MONTH에 해당하는 총 5회 이상 대여한 CAR_ID 값을 찾을 수 있습니다.
3. GROUP BY 후 카운트 수 세기
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 BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(CAR_ID) >= 5)
AND START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY MONTH, CAR_ID
ORDER BY MONTH ASC, CAR_ID DESC
예를 들어서 8월에 CAR_ID가 15인 값들이 3개가 있다고 가정해보겠습니다. 그럼 저희는 RECORDS의 값이 3이 출력 되도록 해야 합니다.
이를 위해 GROUP BY를 할 때 CAR_ID 또는 MONTH 하나만 그룹핑 하는 것이 아닌 CAR_ID와 MONTH를 같이 그룹핑 해준 후 COUNT를 해주면 됩니다.
그리고 문제 조건에 맞게 정렬을 해주시면 해당 코드는 정답이 됩니다!
이상으로 Programmers 문제 풀이를 마치도록 하겠습니다.
'Data Analyst > SQL' 카테고리의 다른 글
[SQL] Programmers 문제 풀기(즐겨찾기가 가장 많은 식당 정보 출력하기) (0) | 2024.10.30 |
---|---|
[SQL] Programmers 문제 풀기 (자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기) (0) | 2024.10.30 |
[SQL] Programmers 문제 풀기 (물고기 종류 별 대어 찾기) (0) | 2024.10.28 |
[SQL] Programmers 문제 풀기 (연도별 대장균 크기의 편차 구하기) (0) | 2024.10.25 |
[SQL] HackerRank 문제 풀기 (Symmetric Pairs) (0) | 2024.10.15 |