반응형
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: 월별 대여 횟수를 계산
조건을 만족하는 차량의 대여 기록에서 월별 대여 횟수를 계산합니다. 이를 위해:
- MONTH(P.START_DATE)로 월을 추출.
- GROUP BY를 사용해 월(MONTH)과 차량 ID(CAR_ID)별로 그룹화.
- 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 열에 각 월별 차량의 대여 횟수를 출력합니다.
얻은 인사이트:
- 그룹화와 서브쿼리의 활용:
- GROUP BY와 서브쿼리를 활용하여 특정 조건을 만족하는 데이터를 효율적으로 필터링할 수 있었습니다.
- 서브쿼리 내에서 CAR_ID별로 대여 횟수를 집계하고, 이를 JOIN하여 원본 데이터를 필터링함으로써 정확한 결과를 도출할 수 있었습니다.
- JOIN을 통한 데이터 결합:
- JOIN을 활용하여 서브쿼리의 결과와 원본 데이터를 결합함으로써, 조건을 만족하는 데이터만을 추출할 수 있었습니다.
- 이는 대규모 데이터셋에서 특정 조건을 만족하는 데이터를 효율적으로 처리하는 데 유용합니다.
- SQL 문법의 중요성:
- 비교 연산자의 올바른 사용 (<= vs =<)과 서브쿼리의 별칭 지정은 SQL 쿼리 작성 시 필수적인 요소입니다.
- 잘못된 문법은 예상치 못한 오류를 발생시킬 수 있으므로, 항상 주의가 필요합니다.
- 데이터 집계의 정확성:
- COUNT(history_id) >= 5 조건을 통해, 총 대여 횟수가 5회 이상인 차량만을 대상으로 분석함으로써, 보다 의미 있는 데이터를 얻을 수 있었습니다.
- 이는 분석 목적에 맞는 정확한 데이터 집계의 중요성을 보여줍니다.
반응형
'SQL' 카테고리의 다른 글
| [SQL/solvesql LV4] 세 명이 서로 친구인 관계 찾기 (1) | 2025.03.20 |
|---|---|
| [SQL/프로그래머스 LV3] 멀티 플랫폼 게임 찾기 (0) | 2025.02.05 |
| [SQL/프로그래머스 LV.3] 헤비 유저가 소유한 장소 (3) | 2025.01.16 |
| [SQL/solvesql] LV3. 쇼핑몰의 일일 매출액과 ARPPU (6) | 2025.01.16 |
| [SQL/solvesql] LV3. 지역별 주문의 특징 (0) | 2025.01.09 |