본문 바로가기
TIL

[TIL] 241216

by 좌우지간에 2024. 12. 16.

금요일에 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