Dev Hyeri

◖코딩 테스트◗▬▬▬▬▬▬▬▬▬/프로그래머스

[SQL KIT] (2024) 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기(설명/코드/정답)

_hyeri 2024. 1. 22. 19:05

 

 

문제 링크 :https://school.programmers.co.kr/learn/courses/30/lessons/157340

 

POINT.

  1. CASE/WHEN/THEN 사용 가능
  2. '2022-10-16' BETWEEN START_DATE AND END_DATE 작성 가능

코드.

SELECT CAR_ID, MAX(CASE 
                      WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE THEN '대여중' 
                      ELSE '대여 가능' 
                   END) AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;

 

 

 

내부 동작 순서 

 

1. FROM 절

FROM 절 : CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 모든 데이터를 가져옵니다.

 

2. GROUP BY 절 

CAR_ID를 기준으로 그룹화하여 동일한 CAR_ID를 가진 행들을 하나로 합침

 

3. SELECT  절

각 그룹에 대한 CAR_ID와 CASE/ WHEN/ THEN으로 처리된 컬럼 조회 

(CASE WHEN THEN을 사용해 각 자동차 대여 기록에 대해 '2022-10-16' 날짜에 대여 중인지 여부를 확인,  AVAILABILITY 컬럼의 값을 설정한다. 위 표의 분홍색 상자에 표시된 행들을 보면 CAR_ID 2번의 경우  '2022-10-16'에 대여 중이라 사용자가 해당 날짜에 대여할 수 없는 CAR_ID임을 알 수  있고 CAR_ID 3번의 경우 사용자가 해당 날짜에 대여할 수 있음을 알 수 있다. 

MAX의 경우 '대여 가능'은 '대여중'보다 사전 순으로 더 큰 값이므로, 대여 중인 기록이 있는 ID의 경우 '대여중'이 최댓값이 된다. )  

 

4. ORDER BY 절

최종 결과를 CAR_ID를 기준으로 내림차순으로 정렬

 


 

초기 코드

 

SELECT CAR_ID, AVAILABILITY
FROM 
    (SELECT *, CASE 
                 WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE THEN '대여중' 
                 ELSE '대여 가능' 
               END AVAILABILITY
     FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
     GROUP BY CAR_ID, AVAILABILITY
     ORDER BY CAR_ID, AVAILABILITY DESC) INLINE_VIEW
GROUP BY CAR_ID
ORDER BY CAR_ID DESC

 

=> 정상 출력

CAR_ID AVAILABILITY
30 대여 가능
29 대여중
28  대여중
27 대여중
26 대여중
25 대여중
24 대여중
23 대여중
22 대여중
21 대여 가능
20 대여중
19 대여중
18 대여중
17 대여중
16 대여중
15 대여 가능
13 대여 가능
12 대여중
11 대여중
10 대여 가능
9 대여중
8 대여중
7 대여중
6 대여중
5 대여중
4 대여중
3 대여 가능
2 대여중
1 대여 가능

 

쿼리 개선 가능성 있음

1. 서브쿼리 절(인라인 뷰)에서 GROUP BY, ORDERY BY 절을 사용하지 않을 수 있다.

 --> 외부에서도 GROUP BY가 중복으로 사용된다면 코드를 줄일 방법이 없는지 확인

2. 서브쿼리도 사용하지 않을 수 있다.