[프로그래머스] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

yannie·2024년 10월 8일
0

[문제]

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.

[내가 푼 풀이(오답)]

SELECT
    CAR_ID,
    CASE
        WHEN END_DATE <= '2022-10-16' THEN '대여 중'
        WHEN END_DATE > '2022-10-16' THEN '대여 가능'
    END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
;

END_DATE를 기준으로 END_DATE가 '2022-10-16'보다 작거나 같으면 '대여중'이고 2022-10-16 이후이면 '대여 가능'일 것이다 라는 전제하에 코드를 작성하였다.

-> 문제는 '2022-10-16'보다 빠르게 반납을 했다면 대여 가능한 것이 아닌가? 라는 생각이 들었다.

그럼 BETWEEN을 사용해야겠다고 생각했다.

SELECT
    CAR_ID,
    CASE
        WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE THEN '대여중'
        ELSE '대여 가능'
    END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
;

BETWEEN을 활용했지만 오류가 났다. 왜?

데이터를 확인해 본 결과,
하나의 자동차가 여러 번 대여되었다가 반납되었다.
그래서 각 CAR_ID를 기준으로 MIN(START_DATE)와 MAX(END_DATE)를 확인했다.

SELECT
    CAR_ID,
    MIN(START_DATE),
    MAX(END_DATE)
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
;

그렇다면 MIN(START_DATE)와 MAX(END_DATE)사이에 '2022-10-16'이 있으면 '대여중'인 것이고, 없으면 '대여 가능'이 아닌가?

SELECT
    CAR_ID,
    CASE
        WHEN '2022-10-16' BETWEEN MIN(START_DATE) AND MAX(END_DATE) THEN '대여중'
        ELSE '대여 가능'
    END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
;

... 아니래...왜...?

아!!!!!!
같은 CAR_ID로 여러 번 대여를 하고,
자동차를 반납하는 날짜와 다시 대여를 하는 날짜에는 차이가 있다.
ex.
위의 사진처럼 같은 CAR_ID의 START_DATE와 END_DATE를 살펴보면,
8월 4일부터 8월 8일까지 자동차를 대여되었고, 이후 8월 14일부터 대여가 시작되었다.
즉, START_DATE와 END_DATE가 이어지지 않는다!!!!
그렇기 때문에 MIN, MAX를 활용하는 것 자체가 잘못되었다.
CAR_ID의 BETWEEN START_DATE AND END_DATE를 하나씩 살펴보고 '2022-10-16'이 있다면 대여 중인 것이다.
=> 그렇기 때문에 서브쿼리가 필요한 것이다!!!!!

[정답 풀이]

SELECT
    CAR_ID,
    CASE
        WHEN CAR_ID IN (SELECT CAR_ID
                        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                       WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE) THEN '대여중'
        ELSE '대여 가능'
    END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
;

기억해!

어려워...

0개의 댓글