본문 바로가기
코딩테스트/SQL 코테

[프로그래머스 SQL] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

by 코듀킹 2023. 7. 31.

정답쿼리

SELECT car_id, max(if('2022-10-16' between start_date and end_date, '대여중','대여 가능')) as AVAILABILITY
from car_rental_company_rental_history
group by car_id
order by car_id desc;

 

설명

2022-10-16일의 조건을 맞추는게 조금 까다로운 문제였다. 쿼리를 하나하나 쪼개서 살펴보겠다. 

 

if('2022-10-16' between start_date and end_date, '대여중', '대여 가능')
if (조건문, 참일 때 반환하는 값, 거짓일 때 반환하는 값)

 

 

'2022-10-16'일이 start_date와 end_date 사이에 있으면, '대여중'을 반환하고, 그 사이에 없으면 '대여 가능'을 반환한다.

 

max(if('2022-10-16' between start_date and end_date, '대여중','대여 가능'))
group by car_id

 

max 함수는 group by와 함께 사용해야한다. group by를 통해 car_id를 기준으로 묶어주고, 위 조건을 max함수를 통해 반환하면, 같은 car_id 중에 가장 큰 값이 실행 결과로 나타난다.

 

근데, if 안에 있는 조건이 반환하는 값이 '대여중', '대여 가능'이기 때문에 이 중에 가장 큰 값? 조금 이상하다고 느껴질 수 있다. '대여중'은 사전준(알파벳순)으로 정렬할 때 '대여가능'보다 큰 것으로 간주되어 해당 차량의 대여 기록에 '대여중'이 있는 레코드가 하나라도 있으면 대여중'이 되고, 그렇지 않으면 '대여 가능'이 반환된다. 

 

즉, MAX를 여기에서 사용하면, 최대 값을 찾는 것이 아니라 특정 날짜('2022-10-16')에 자동차를 사용할 수 있는지 또는 임대했는지 여부를 파악할 수 있다.

댓글