코딩 테스트 연습/[프로그래머스][리트코드] MySQL

[LV.4] String, Date > 자동차 평균 대여 기간 구하기

duswjd_data 2025. 7. 2. 09:40

문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 설명

  • CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성
  • 평균 대여 기간은 소수점 두번째 자리에서 반올림
  • 결과는 평균 대여 기간을 기준으로 내림차순 정렬, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬

정답 코드

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
  • 참고) HAVING AVERAGE_DURATION >= 7 은 MySQL에선 작동하지만, 일부 DBMS에서는 별칭 사용이 허용되지 않음
    • HAVING AVG(DATEDIFF(END_DATE, START_DATE) + 1) >= 7 사용

코드 설명 (개선 포함)

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 AVG(DATEDIFF(END_DATE, START_DATE) + 1) >= 7   # 평균 대여 기간이 7일 이상인 자동차만 필터링
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC

첫 번째 시도 (실패)

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
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC
  • 평균 대여 기간이 7일 이상인 자동차만 출력하는거 잊음