💥 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)


# 내코드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
'Sparta > CODEKATA' 카테고리의 다른 글
| [250825] 스파르타코딩 본캠프 15일차 (2) - 필수과제 (2) | 2025.08.25 |
|---|---|
| [250824] 파이썬 코테 01 (3) | 2025.08.24 |
| [250821] 스파르타코딩 본캠프 13일차 (2) (0) | 2025.08.21 |
| [250820] 스파르타코딩 본캠프 12일차 (2) (0) | 2025.08.20 |
| [250819] 스파르타코딩 본캠프 11일차 (2) (0) | 2025.08.19 |