관리 메뉴

오늘도 배운다

자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 / 프로그래머스, SQL, MySQL 본문

코딩테스트연습(SQL)

자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 / 프로그래머스, 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

 

 

 

풀이(MySQL)

더보기

문제에서 요구하는 availability 데이터를 CASE WHEN 으로 쿼리

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를 하면 된

 

 

 

문제 바로가기(MySQL)

728x90
Comments