-
<프로그래머스> 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기코딩테스트/SQL 코딩테스트 2024. 1. 10. 21:41
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/157340
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 문제 요구사항
- CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서
- 2022년 10월 16일에 대여중인 자동차의 경우 '대여중', 대여 중이지 않은 자동차의 경우 '대여 가능'을 표시하는 컬럼(AVAILABILITY)을 추가하여
- 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문 작성
- 반납 날짜가 2022년 10월 16일인 경우에도 대여중으로 표시
- 결과는 자동차 ID를 기준으로 내림차순 정렬
우선 문제를 풀기 위해서 2022년 10월 16일에 자동차가 대여중인지 아닌지에 대한 현황을 알 필요가 있었다.
그런데 문제는 테이블을 열어보면 해당 차에 대한 대여 기록이 쭉 있어서 한 차량에 대한 과거 기록까지 같이
기록되어 있다는 점이었다.
따라서 대여중인지 아닌지의 여부를 판단하기 위한 임시 테이블로 조건문을 통해 해당 날짜에 대여 중인 차량만을 알아내는 것이 필요했다. 그래서 이 부분을 WITH절로 구현했다.
2022년 10월 16일이 대여 시작일자와 대여 종료일자 사이에 있는 경우의 조건에 해당하는 데이터에 한해서 자동차ID와 AVAILABILITY (대여중)을 출력하게 하는 것을 통해 대여중인 차량 목록을 알아냈다.
이렇게 만든 임시 테이블을 기존 테이블에 LEFT OUTER JOIN하면 임시 테이블에는 존재하지 않는 즉 대여 가능한 차량에의 AVAILABILITY는 NULL값을 갖게 된다. 이렇게 얻어낸 데이터를 자동차 ID를 기준으로 GROUP BY하여 실행하면
아래의 결과를 얻을 수 있다.
이렇게 얻어진 결과에 AVAILABILITY가 NULL 값인 경우에 '대여 가능'으로 대체해주어 문제를 해결하였다.
여기서 '대여 가능'인데 붙여서 '대여가능' 이라고 썼다가 오답처리 당해서 상당한 시간을 소요하게 되었다.
문제를 꼼꼼하게 잘 읽는 습관을 들여야겠다.
정답쿼리
1) MySQL
WITH AVAIL(CAR_ID, AVAILABILITY) AS( SELECT CAR_ID, '대여중' FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE ) SELECT H.CAR_ID, IFNULL(A.AVAILABILITY, '대여 가능') AS AVAILABILITY FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H LEFT OUTER JOIN AVAIL A ON H.CAR_ID = A.CAR_ID GROUP BY 1 ORDER BY 1 DESC;
2) Oracle
WITH AVAIL(CAR_ID, AVAILABILITY) AS( SELECT CAR_ID, '대여중' FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE TO_DATE('2022-10-16', 'YYYY-MM-DD') BETWEEN START_DATE AND END_DATE ) SELECT H.CAR_ID, NVL(A.AVAILABILITY, '대여 가능') AS AVAILABILITY FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H LEFT OUTER JOIN AVAIL A ON H.CAR_ID = A.CAR_ID GROUP BY H.CAR_ID, A.AVAILABILITY ORDER BY H.CAR_ID DESC;
'코딩테스트 > SQL 코딩테스트' 카테고리의 다른 글
<LeetCode> Group Sold Products By The Date (0) 2024.04.10 <프로그래머스> 자동차 대여 기록 별 대여 금액 구하기 (0) 2024.01.10 <프로그래머스> 입양 시각 구하기(2) (0) 2024.01.09 <프로그래머스> 조건에 부합하는 중고거래 댓글 조회하기 (1) 2024.01.09 <프로그래머스> 저자 별 카테고리 별 매출액 집계하기 (0) 2023.12.28 - 문제 요구사항