자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 / 프로그래머스, SQL, MySQL
LearnerToRunner
2023. 3. 20. 21:59
문제
source: 프로그래머스
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.
제출답안(MySQL)
SELECT
car_id,
CASE
WHEN start_date <='2022-10-16' AND end_date >= '2022-10-16' THEN '대여중'
ELSE '대여 가능' END AS availability
FROM
(SELECT car_id, MAX(start_date) AS start_date, MAX(end_date) AS end_date
FROM (SELECT *
FROM car_rental_company_rental_history
WHERE start_date <= '2022-10-16') AS history_by_2022_10_16
GROUP BY car_id) AS latest_history_by_car
ORDER BY
car_id DESC
SELECT
car_id,
CASE
WHEN start_date <='2022-10-16' AND end_date >= '2022-10-16' THEN '대여중'
ELSE '대여 가능' END AS availability
>> 대여중이려면 start date가 2022-10-16 이전 또는 당일날 빌렸으면서 (AND) 반납일이 2022-10-16 당일 또는 이후이어야한다.
>> 이러한 조건을 CASE WHEN 문에 삽입
2022-10-16 이후의 데이터는 제외한 후, 각 차량의 최신 데이터를 서브쿼리
FROM
(SELECT car_id, MAX(start_date) AS start_date, MAX(end_date) AS end_date
FROM (SELECT *
FROM car_rental_company_rental_history
WHERE start_date <= '2022-10-16') AS history_by_2022_10_16
GROUP BY car_id) AS latest_history_by_car
ORDER BY
car_id DESC
>> 아래 자료에서 보이듯 한 차에 여러 히스토리가 있다. 따라서 car_id 별로 최신데이터를 구하기 위해서는 car_id 별로 GROUP BY 한 뒤 start_date와 end_date의 MAX 값을 찾으면 최신 데이터를 얻을 수 있다
>> 다만 history_id 722에서 보이듯 일부는 2022-10-16 이후의 예약내역도 있기 때문에 GROUP BY MAX를 할 경우, 2022-10-16 이후의 데이터가 집계될 것이다. 따라서 2022-10-16 기준으로 대여가능 여부를 알 수 없는 문제가 발생한다
>> 따라서 2022-10-16 까지만 적용되는 데이터를 얻기 위해서는 start_date 가 2022-10-16 당일 이거나 이전인 데이터에 GROUP BY를 하면 된