문제설명
다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.
문제
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬명: RECORDS) 리스트를 출력하는 SQL문을 작성해 주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해 주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해 주세요.
입출력 예 & 설명
예를 들어 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블이 다음과 같다면
대여 시작일을 기준으로 총 대여 횟수가 5회 이상인 자동차는 자동차 ID가 1, 2인 자동차입니다. 월 별 자동차 ID별 총 대여 횟수를 구하고 월 오름차순, 자동차 ID 내림차순으로 정렬하면 다음과 같이 나와야 합니다.
나의 풀이
꽤 어려웠던 문제였습니다..
그 이유는 메인 쿼리의 "날짜 조건" 때문입니다. 많은 분들이 저처럼 해당 부분을 이해하지 못하거나 헷갈려서 찾아보신 분들이 있으실 거라고 생각합니다.
위 결과는 13번째 줄을 주석처리 한 쿼리와 주석처리 하지 않은 쿼리를 WinMerge란 소스 비교 프로그램을 사용한 결과입니다. 결과는 동일한 결과를 반환하고 있습니다. 즉 테스트 데이터는 모두 8~10월의 데이터만 존재하기 때문에 메인 쿼리에서 13번째 줄인 "날짜 조건"을 주석처리해도 답과는 동일한 데이터가 나옵니다.
예를 들어 2022.08 ~ 2022.10의 데이터도 존재하고 즉 "날짜 조건"도 만족하고, 2022.07의 데이터도 존재한다면 2022.07의 데이터도 같이 처리되기 때문에 메인쿼리에서도 날짜 조건을 넣어줘야 합니다.
따라서 "해당 기간 동안"이라는 문구 때문에 메인쿼리에서도 날짜를 조건에 넣어줘야 합니다.
그렇기 때문에 더욱더 헷갈리는 문제였습니다.
개인적인 생각은 테스트 데이터라도 다양한 데이터가 존재했더라면 조금 덜 헷갈렸을 것 같습니다..
이제 문제 풀이를 설명하자면 일단 8월부터 10월까지 총 5건 이상 대여한 차량들의 집합칼럼(TMP)을 만들어야 합니다.
WITH 문을 사용하여 대여 시작일이 2022.08 ~ 2022.10이고, 대여 횟수가 5 이상인 TMP 임시 집합을 만들어줍니다.
메인 쿼리에서 "월별 자동차 ID 별" 이니깐 GROUP BY를 CAR_ID와 MONTH로 해주고, 위에서 말했듯이 메인 쿼리에서도 날짜 조건을 넣어주고 마지막으로 총 대여 횟수가 0이 아닌 데이터를 출력해 주어 마무리해줬습니다.
다른 풀이 ✅
"나의 풀이"와 동일하지만 서브 쿼리를 사용한 쿼리입니다.
'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.1 예산 (greedy, 탐욕, 그리디 알고리즘, Java) (0) | 2024.06.08 |
---|---|
[프로그래머스] 없는 숫자 더하기 (Arrays.stream() anyMatch, sum(), Java) (1) | 2024.06.08 |
[프로그래머스] 연도별 대장균 크기의 편차 구하기 (MySQL) (0) | 2024.05.03 |
[프로그래머스] 짝지어 제거하기 (JavaScript) (1) | 2024.05.03 |
[SQL] 대장균들의 자식의 수 구하기 (MySQL) (0) | 2024.05.03 |