금요일에 3시간을 붙잡고 있어도 못풀었던 문제.
주말동안에 생각해서 결국 월요일에 문제해결에 성공했다.

얼핏 보면 between 등으로 날짜조건만 넣으면 쉽게 해결될 것 같지만 사실 각각의 자동차ID 여러개의 대여기록을 가지고 있고 10월 16일 이후에도 많은 대여기록이 존재하기 때문에 중복된 데이터를 거르고 10월 16일의 대여 가능여부만 뽑아내는데 어려움이 있다.
처음에는 car_id를 distinct를 써서 중복을 제거해야하나 했지만 사실 distinct는 레코드값이 모두 동일한 완전히 일치하는값에 대해 하나로 합쳐서 출력해주는 기능이기에 여러 대여기록을 합치지 못하고
그다음에 생각한 max(start_date)로 최신 대여기록을 기준으로 조건을 판별한다 >> 이것 역시 10월16일이후에 대여기록이 있다면 대여가능여부를 판별할수 없기때문에 실패했다.
#모범답안
SELECT
CAR_ID,
CASE
WHEN sum('2022-10-16' BETWEEN START_DATE AND END_DATE) = 1 THEN '대여중'
# max or sum 다가능, = 1, =>1 , <>0 다 가능 왤까요??
ELSE '대여 가능'
END AVAILABILITY
FROM
CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY 1
ORDER BY 1 DESC
내가 해결한 방법은 각 car_id의 여러 대여기록중 10월16일에 대여중이라는 조건이 한번이라도 해당된다면 대여중으로 분류 해내는 방법이었다.
그렇기 때문에 주석에 써진것처럼 sum 이나 max 어떤것을 사용해도 결과는 동일하다.
또 group by를 사용하기 때문에 distinct car_id 를 할필요가 없다.
SELECT DISTINCT
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
ORDER BY CAR_ID DESC;
지피티 선생님은 서브쿼리에서 일단 10월16일에 대여중인 차량id를 뽑아두고 메인쿼리에서 해당 차량 id가 있다면 대여중으로 출력하는 방식으로 분류해냈다.
이 경우에는 집계함수를 쓰지않았기 때문에 group by를 사용할수 없다. 그렇기 때문에 car_id를 중복되지 않게하기 위해 distinct를 필수로 활용해야 코드가 정상적으로 작동한다.
'TIL' 카테고리의 다른 글
| [알고리즘] 시간 복잡도, 공간 복잡도 (1) | 2025.02.04 |
|---|---|
| Docker 소개 (0) | 2025.01.31 |
| [TIL] 241210 코사인 유사도, 고유값과 고유벡터 (5) | 2024.12.10 |
| [WIL] 24.12 1주차 (2) | 2024.12.06 |
| [TIL] 241206 Markdown 문법 정리 (1) | 2024.12.06 |