해당 섹션은 프로그래머스/리트코드/해커랭커 등 외부 사이트에서 SQL 오답 문제에 대한 오답을 적고, 어느 부분에서 막혔고, 무엇을 배웠는지에 대해 간략하게 기록 하기 위함임.
원인 분석에 집중하세요: 정답 코드를 이해하는 것보다 내가 왜 틀렸는지를 한두 줄이라도 직접 글로 써보는 과정이 가장 중요합니다. '실수했다'에서 그치지 않고 '왜 실수했는지'를 파고들어야 같은 실수를 반복하지 않습니다.
태그를 적극적으로 활용하세요: #JOIN, #서브쿼리, #날짜함수 와 같이 태그를 꾸준히 달아두면, 나중에 특정 개념이 약하다고 느낄 때 해당 태그가 달린 문제들만 모아서 복습할 수 있습니다.
주기적으로 다시 풀어보세요: 일주일 뒤, 한 달 뒤에 오답 노트를 보면서 코드를 보지 않고 다시 한번 풀어보세요. 완벽하게 풀 수 있다면 그 개념은 이제 당신의 것이 된 겁니다.
-- 여기에 내가 작성했던 틀린 코드를 그대로 붙여넣으세요.
with main as(
select
car_id,
start_date,
end_date,
case when start_date <=date_format('2022-10-16','%Y-%m-%d') and
end_date >=date_format('2022-10-16','%Y-%m-%d') then '대여중'
else '대여 가능'
end as AVAILABILITY
from
CAR_RENTAL_COMPANY_RENTAL_HISTORY
order by 1 desc
)
select
distinct
car_id,
first_value(AVAILABILITY) over (partition by car_id order by end_date desc) as AVAILABILITY
from
main
order by
1 desc
🤔 오답 원인 분석
오류 메시지 또는 실패 원인: [예: 'end_date가 느린 날짜의 데이터를 이용가능 데이터 값으로 가져오는 논리, 즉 가장 최근에 반납된 기록의 상태가 그 자동차의 최종 상태일 것이라는 가정.']
근본적인 실수: [예: '가장 최근의 반납 기록이 마지막 상태가 아닐 수도 있음
1번 기록: 2022-10-10 ~ 2022-10-20 (반납일: 10-20) -> '대여중'
2번 기록: 2022-11-05 ~ 2022-11-15 (반납일: 11-15) -> '대여 가능' ---> 해당 값으로 매칭되면 틀릴 수도 있음]
SELECT
CAR_ID,
CASE
WHEN MAX(AVAILABILITY_FLAG) = 1 THEN '대여중' --- ② 2022-10-16 기간이 있는 경우는 무조건 대여중
ELSE '대여 가능'
END AS AVAILABILITY
FROM (
SELECT
CAR_ID,
CASE
WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE THEN 1
ELSE 0 --- ① 대여 기간안에 속하면 1이라는 표시
END AS AVAILABILITY_FLAG
FROM
CAR_RENTAL_COMPANY_RENTAL_HISTORY
) AS SUBQUERY
GROUP BY
CAR_ID
ORDER BY
CAR_ID DESC;




주요 함수/문법: flag 지정하는 법
배운 점:
특정 시점을 단순 첫번째, 마지막 데이터로 확인 할 수 없는 경우는 flag를 써서 해당 값이 어디에 해당 하는지 표시하는 방법에 대해 배웠다.