본문 바로가기

코딩테스트_SQL

250324 프로그래머스 자동차 평균 대여 기간 구하기

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

[풀이]
1) CAR_ID, AVERAGE_DURATION 조회
2) 평균 대여 기간이므로 AVG() 집계 함수 사용
3) AVERAGE_DURATION은 소수점 두번째 자리에서 반올림 -> ROUND(, 1)
4) 대여 일수를 빼는 것이므로 DATEDIFF() 함수를 사용하고, END_DATE-START_DATE를 하면 첫 날의 값이 빠지게 되므로 +1을 통해 날짜 맞춰주기
5) AVERAGE_DURATION가 7 이상인 행만 출력이므로 조건 추가하기
5) AVERAGE_DURATION 기준으로 내림차순 & AVERAGE_DURATION이 같으면 CAR_ID 기준으로 내림차순 정렬

 

[오답 분석하기]
1) ROUND((DAY(END_DATE)=DAY(START_DATE)), 1) 

SELECT CAR_ID, 
    ROUND((DAY(END_DATE)=DAY(START_DATE)), 1) AVERAGE_DURATION
..

** 지금 이 연산은 단순히 '일(day)'값이 같은지 비교하는 논리연산(boolean)

- 음수 값이 나오면서 잘못되고 있다는 것을 깨달았다. -> 날짜 차이를 계산해야 하는데, 지금 내가 한 방식으로는 두 날짜가 같은지 여부만 체크하는 거라 대여 기간 구하는데 적절하지 않다.
-> 따라서 날짜 함수인 DATEDIFF(종료 날짜, 시작 날짜)를 통해 두 기간 사이의 일수를 계산한다.

    이때, 대여 시작일도 포함되므로 +1을 해준다.

SELECT CAR_ID,
	AVG(DATEDIFF(END_DATE, START_DATE))+1 AVERAGE_DURATION
..


2) WHERE절로 조건 적기

..
WHERE AVG(DATEDIFF(END_DATE, START_DATE))+1 >= 7

** 집계 함수는 GROUP BY 이후에만 사용 가능하다.
- WHERE 절에서는 개별 행 단위 조건만 검사할 수 있으므로, 직접 WHERE절에 집계 함수를 쓰게 되면 SQL 문법 오류가 발생
-> 따라서 집계 함수는 HAVING 절에서 필터링해야 한다.

 

[정답]

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

=> 앞에서 오류가 났던 사항 2가지(HAVING & DATEDIFF()+1)를 반영시켜주면서 성공적으로 실행 완료