Sparta/CODEKATA

[250822] 스파르타코딩 본캠프 14일차 (2)

junecho 2025. 8. 22. 13:17

💥  CODEKATA                                                                                                           

~ 60문제

 

오늘 문제는 재밌고 유익했다!

SUM() 의 다른 기능을 알게 되어서 좋았음

 

 

 

 

59) 자동차 대여 기록에서 대여중/대여가능 여부 구분하기

# 내코드
SELECT 
    a.car_id, a.AVAILABILITY
FROM (
    SELECT
        car_id, start_date, end_date, CASE
        WHEN start_date = "2022-10-16" or end_date = "2022-10-16" THEN "대여중"
        WHEN start_date <= "2022-10-16" and end_date >= "2022-10-16" THEN "대여중"
        ELSE "대여 가능" END AS AVAILABILITY,
        ROW_NUMBER() OVER(PARTITION BY car_id ORDER BY end_date DESC) AS rnk
    FROM
        car_rental_company_rental_history
    ) a
WHERE 
    a.rnk = 1
ORDER BY
    a.car_id DESC

⇒ 결과는 동일한데, 문제에서 제시하는 “2022년 10월 16일에 대여 중인 자동차인 경우“ 가 아니라 날짜 조건은 다 구해놓고도 대여중/대여 가능 2개가 뜬 차들 중에서는 제일 최신으로 비교해서 뽑는다고 ROW_NUMBER()를 써버림.

문제 의도를 내 마음대로 해석하는 습관을 버려야 되는데 쉽지 않다.

car_id 가 1~30까지 있고 중복값으로 존재하는데, AVAILABILITY 에서도 대여중/대여 가능 중에 대여중을 선택(아래캡쳐1) 해야 해서 접근 방식은 알았는데 쿼리 작성 방식을 몰라서 검색했음. 파이썬이면 그냥 IF 때려가지고 하면 되는데, SQL의 IF는 그게 아니니까.

지피티한테 검색해보니 SUM 함수로 푸는 방법을 알려줘서 신박했음.

더 자세한 구동원리를 물어봄(아래캡쳐2)

캡쳐1
캡쳐2

# 내코드2
# SUM 함수의 다른 사용법을 알게된 후 쓴 코드
SELECT
    a.car_id, CASE
        WHEN SUM(CASE WHEN a.AVAILABILITY = "대여중" THEN 1 ELSE 0 END) > 0 THEN "대여중"
        ELSE "대여 가능"
    END AS AVAILABILITY
FROM (
    SELECT
        car_id, start_date, end_date, CASE
            WHEN start_date = "2022-10-16" or end_date = "2022-10-16" THEN "대여중"
            WHEN start_date <= "2022-10-16" and end_date >= "2022-10-16" THEN "대여중"
            ELSE "대여 가능" 
        END AS AVAILABILITY
    FROM
        car_rental_company_rental_history
) a
GROUP BY
    a.car_id
ORDER BY
    a.car_id DESC