새소식

Programmers Coding Test/MySQL

[프로그래머스 157342] MySQL - Level2 자동차 평균 대여 기간 구하기

  • -

 

자동차 평균 대여 기간 구하기

 

https://school.programmers.co.kr/learn/courses/30/lessons/157342

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

1)  문제

다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다.

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 

평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.

 

Column name Type Nullable
HISTORY_ID INTEGER FALSE
CAR_ID INTEGER FALSE
START_DATE DATE FALSE
END_DATE DATE FALSE
 

 

 

2)  예시

 

예를 들어 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블이 다음과 같다면

 

HISTORY_ID CAR_ID START_DATE END_DATE
1 1 2022-09-27 2022-10-01
2 1 2022-10-03 2022-11-04
3 2 2022-09-05 2022-09-05
4 2 2022-09-08 2022-09-10
5 3 2022-09-16 2022-10-15
6 1 2022-11-07 2022-12-06

 

 

 

자동차 별 평균 대여 기간은

자동차 ID가 1인 자동차의 경우, 대여 기간이 각각 5일, 33일, 30일인 기록이 존재하므로 평균 22.7일
자동차 ID가 2인 자동차의 경우, 대여 기간이 각각 1일, 3일인 기록이 존재하므로 평균 2일
자동차 ID가 3인 자동차의 경우, 대여 기간이 30일인 기록만 존재하므로 평균 30일 입니다. 평균 대여 기간이 7일 이상인 자동차는 자동차 ID가 1, 3인 자동차이고, 평균 대여 기간 내림차순 및 자동차 ID를 기준으로 내림차순 정렬하면 다음과 같이 나와야 합니다.

 

 

 

CAR_ID AVERAGE_DURATION
3 30.0
1 22.7

 

 

 

 

3)  풀이

 

1. 테이블에서 자동차 아이디, 평균 대여기간을 조회합니다.

● SELECT CAR_ID,
    ROUND(AVG(DATEDIFF(END_DATE,START_DATE)+1), 1) AS AVERAGE_DURATION
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY

 

 

※ ROUND(숫자, 표시할 소수점자릿수)

숫자를 반올림하여 지정한 소수 자릿수까지 나타내는 데 사용되는 SQL 함수입니다.

소수점 두번째자리에서 반올림하라고하였으니, 소수점 첫째자리까지만 표기되야하니,

위에서 ROUND(숫자, 1)로 해주었습니다.

 

 

※ AVG(값)

값을 값의 개수로 나누어 평균을 구합니다.

 

 

 

※ DATEDIFF(B, A)

B와 A의 날짜 차이를 계산해줍니다.

시작일과 마지막일을 감안하기위해 +1을 해주었습니다.

만약 +1 해주지 않고 시작일과 마지막일이 동일하다면, 1일 대여했음에도 불구하고 0일 대여한 것으로 나오기때문입니다.

 

 

 

※ DATE에 - 연산자를 사용하지 않은 이유

END_DATE - START_DATE로 빼기 연산자를 사용하지 않은 이유는,

이렇게 되면 날짜가 아닌 시간을 값으로 구해내기 때문입니다.

예) END_DATE     : 2023-08-31 10:00:00

      START_DATE : 2023-08-31 07:00:00

=> END_DATE - START_DATE  = 3 HOUR

 

 

 

 

 

2. 자동차 ID로 그룹화하고, 평균 대여기간이 7일 이상인 값을 조건으로 합니다.

● GROUP BY CAR_ID

    HAVING AVERAGE_DURATION>=7

 

※ HAVING

GROUP BY 절과 함께 사용되며, 그룹화된 결과에 조건을 적용하는 역할로,

일반적으로 HAVING 절은 집계 함수(예: COUNT, SUM, AVG 등)와 함께 사용됩니다.

 

HAVING 절은 WHERE 절과 유사하게 조건을 지정하지만, 

WHERE 절은 개별 레코드에 대한 조건을 검사하고, HAVING 절은 그룹화된 결과 집합에 조건을 검사합니다.

 

 

 

 

 

 

3. 평균 대여기간 내림차순으로 정렬하고, 평균대여기간이 같다면 자동차 아이디로 내림차순 정렬합니다.

● ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;

 

 

 

 

 

 

4)  코드

SELECT
    CAR_ID,
    ROUND(AVG(DATEDIFF(END_DATE,START_DATE)+1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVERAGE_DURATION>=7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.