문제 출처: 프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/157342
Q. 자동차 평균 대여 기간 구하기
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.

풀이 과정_최초
- 문제 요구 조건 확인
자동차별 평균 대여 기간 반환 필요
자동차별 평균 대여 기간 = 각 HISTORY_ID, CAR_ID별로 (END_DATE - START_DATE)를 구한 뒤,CAR_ID별로 HISTORY_ID 개수만큼 나눠주면 됨 - 테이블 결합 조건 설정
평균 대여 기간 구할 테이블 있어야 할 듯 - 필터링 조건 설정
평균 대여 기간 >=7 - 필요 칼럼
- CAR_ID
- AVERAGE_DURATION - 최종 뷰 조건
- 평균 대여 기간 (AVERAGE_DURATION)으로 DESC, CAR_ID로 ASC
A. 초기 답안
with period as (
select HISTORY_ID
, CAR_ID
, (END_DATE - START_DATE) as rent_period
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
group by HISTORY_ID)
select CAR_ID
, round(sum(rent_period)/count(distinct HISTORY_ID),2) as AVERAGE_DURATION
from period
group by CAR_ID
order by AVERAGE_DURATION desc, CAR_ID asc
- 가독성: 굳이 CTE를 쓰지 않아도 되는데, 쓰는 바람에 가독성 떨어짐 → AVG로 계산이 더 명확
- 성능: CTE + SUM + COUNT + GROUP BY = 중간 계산 많음
- 7일 이상인 필터링 조건도 적용 안했고
- "대여"의 개념이 시작일이 포함되어야 하므로, 날짜끼리 뺀거에서 1을 더해줘야 함
A2. 최종 답안
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
- 가독성: AVG 함수 활용하여 가독성 명확
- 성능: CTE가 없어 성능 향상
짚고 넘어갈 것(1)- 날짜 집계 관련
- 1. DATEDIFF(col1,col2)
두 값의 차이를 INT로 반환
#활용 예시
#1. 평균 체류일
AVG(DATEDIFF(end,str))
#2. 7일 이상 대여
where DATEDIFF(end,str)>=7
#3. 최근 이벤트까지의 날짜 차이
DATEDIFF(CURDATE(),event_date)
- TIMESTAMPDIFF(col1, col2)
- DATE_ADD(), DATE_SUB()
짚고 넘어갈 것(2)- Having
그냥 왜 그런지 모르겠으나...having을 잘 안써버릇했는데.....익혀놔야겠다
where과 having 차이
- where
- 필터링 대상: 개별 행 기준으로 필터링
- 위치: group by 전
- ex: where price >=1000
- having
- 필터링 대상: 그룹 집계 결과
- 위치: group by 후
- ex: having AVG(price)>1000
'Base > SQL' 카테고리의 다른 글
| [SQL 코딩 테스트 준비] #7. 없어진 기록 찾기 (2) | 2025.07.26 |
|---|---|
| [SQL 코딩 테스트 준비] #6. 조건에 맞는 도서와 저자 리스트 출력하기 (3) | 2025.07.26 |
| [SQL 코딩 테스트 준비] #4. 가격이 제일 비싼 식품의 정보 출력하기 (0) | 2025.07.22 |
| [SQL 코딩 테스트 준비] #3. 상위 n개 레코드 (0) | 2025.07.19 |
| [SQL 코딩 테스트 준비] #2. 재구매가 일어난 상품과 회원 리스트 구하기 (0) | 2025.07.19 |





