SQL

[SQL/프로그래머스 LV3] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

jy9892 2025. 1. 17. 10:00
반응형

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

 

프로그래머스

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

programmers.co.kr

문제 상황:

월별로 대여 횟수가 5회 이상인 차량만 필터링하고, 이러한 차량의 월별 대여 횟수를 계산.

 

문제 접근:

단계 1: 총 대여 횟수가 5회 이상인 차량 필터링

먼저, CAR_ID를 기준으로 그룹화하여 차량별 총 대여 횟수를 계산합니다. 이 중 대여 횟수가 5회 이상인 차량만 추출합니다

 

단계 2: 조건을 만족하는 차량과 원본 데이터를 결합

총 대여 횟수가 5회 이상인 차량만 남긴 서브쿼리 결과를 원본 테이블과 JOIN합니다. 이를 통해 조건에 맞는 차량의 모든 대여 기록을 가져옵니다.

 

단계 3: 월별 대여 횟수를 계산

조건을 만족하는 차량의 대여 기록에서 월별 대여 횟수를 계산합니다. 이를 위해:

  1. MONTH(P.START_DATE)로 월을 추출.
  2. GROUP BY를 사용해 월(MONTH)과 차량 ID(CAR_ID)별로 그룹화.
  3. COUNT(P.HISTORY_ID)를 사용해 월별 대여 횟수를 집계.

 

논리 흐름:

 

  • 필터링 조건 정의:
    • 전체 데이터에서 총 대여 횟수가 5회 이상인 차량만 남깁니다.
  • 조건 만족 차량과 원본 데이터 결합:
    • CAR_ID를 기준으로 서브쿼리와 원본 데이터를 JOIN하여, 필터링된 차량의 모든 대여 기록을 가져옵니다.
  • 월별 집계:
    • 대여 시작 날짜(START_DATE)에서 월(MONTH)을 추출하여 GROUP BY로 그룹화.
    • 각 월별로 대여 횟수를 계산합니다.

 

 

쿼리:

SELECT 
    MONTH(P.START_DATE) AS MONTH, 
    P.CAR_ID, 
    COUNT(P.HISTORY_ID) AS MONTHLY_RECORDS
FROM 
    CAR_RENTAL_COMPANY_RENTAL_HISTORY AS P
JOIN (
    SELECT 
        CAR_ID
    FROM 
        CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE 
        START_DATE >= '2022-08-01' AND START_DATE <= '2022-10-31'
    GROUP BY 
        CAR_ID
    HAVING 
        COUNT(HISTORY_ID) >= 5
) AS A
ON 
    P.CAR_ID = A.CAR_ID
WHERE 
    P.START_DATE >= '2022-08-01' AND P.START_DATE <= '2022-10-31'
GROUP BY 
    MONTH(P.START_DATE), P.CAR_ID
ORDER BY 
    MONTH ASC, P.CAR_ID DESC;

 

서브쿼리 (A):

  • CAR_ID별로 전체 대여 횟수를 계산하고, 5회 이상 대여된 차량만 필터링합니다:

JOIN:

  • 서브쿼리 결과(A)와 원본 테이블(P)을 CAR_ID 기준으로 JOIN하여, 조건을 만족하는 차량의 월별 데이터를 필터링합니다:

월별 대여 횟수 계산:

  • COUNT(P.HISTORY_ID)를 사용하여 P.START_DATE에서 추출한 월별 대여 횟수를 계산합니다.

GROUP BY:

  • MONTH(P.START_DATE)와 P.CAR_ID를 기준으로 그룹화하여 월별로 집계합니다.

최종 출력:

  • MONTHLY_RECORDS 열에 각 월별 차량의 대여 횟수를 출력합니다.

 

얻은 인사이트:

  1. 그룹화와 서브쿼리의 활용:
    • GROUP BY와 서브쿼리를 활용하여 특정 조건을 만족하는 데이터를 효율적으로 필터링할 수 있었습니다.
    • 서브쿼리 내에서 CAR_ID별로 대여 횟수를 집계하고, 이를 JOIN하여 원본 데이터를 필터링함으로써 정확한 결과를 도출할 수 있었습니다.
  2. JOIN을 통한 데이터 결합:
    • JOIN을 활용하여 서브쿼리의 결과와 원본 데이터를 결합함으로써, 조건을 만족하는 데이터만을 추출할 수 있었습니다.
    • 이는 대규모 데이터셋에서 특정 조건을 만족하는 데이터를 효율적으로 처리하는 데 유용합니다.
  3. SQL 문법의 중요성:
    • 비교 연산자의 올바른 사용 (<= vs =<)과 서브쿼리의 별칭 지정은 SQL 쿼리 작성 시 필수적인 요소입니다.
    • 잘못된 문법은 예상치 못한 오류를 발생시킬 수 있으므로, 항상 주의가 필요합니다.
  4. 데이터 집계의 정확성:
    • COUNT(history_id) >= 5 조건을 통해, 총 대여 횟수가 5회 이상인 차량만을 대상으로 분석함으로써, 보다 의미 있는 데이터를 얻을 수 있었습니다.
    • 이는 분석 목적에 맞는 정확한 데이터 집계의 중요성을 보여줍니다.
반응형