오늘은 SQL 문제를 풀면서 DISTINCT, GROUP BY, 그리고 한 ID가 여러 행을 가질 때 생길 수 있는 실수에 대해 정리해보고자 한다.
프로그래머스의 sql Lv3에 있는 자동차 대여 기록 문제를 풀며 알게 된 개념들이다.
> 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/157340
👩💻 처음 작성했던 쿼리
프로그래머스 자동차 대여 기록 문제를 풀다가 다음과 같은 쿼리를 작성했다.
SELECT CAR_ID,
CASE
WHEN START_DATE < '2022-10-16' AND END_DATE >= '2022-10-16' THEN '대여중'
ELSE '대여 가능'
END AS AVAILABILITY
FROM car_rental_company_rental_history
ORDER BY CAR_ID DESC;
-> 과연 정답일까?
- 결과는 맞는 것처럼 보이지만, 채점에서는 오답 처리된다.
- 이유는 CAR_ID가 중복되어 여러 줄 출력되기 때문이다.
- 문제에서 요구한 건 "CAR_ID별로 딱 한 줄만 출력" 되는 형태였다.
✅ 가장 직관적인 정답 쿼리
SELECT DISTINCT CAR_ID,
CASE
WHEN CAR_ID IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE
) THEN '대여중'
ELSE '대여 가능'
END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
ORDER BY CAR_ID DESC;
💡 이 쿼리의 핵심은?
- DISTINCT로 중복된 CAR_ID를 제거해 각 차량당 한 줄만 출력되도록 처리한다.
- '2022-10-16'이라는 기준일이 대여 기간 안에 포함되어 있다면 '대여중', 아니면 '대여 가능'으로 판단한다.
- BETWEEN START_DATE AND END_DATE가 날짜 범위 체크에 아주 직관적이고 명확하다.
🎯 배운 점 1: DISTINCT는 언제 쓸까?
- 특정 컬럼(예: CAR_ID)에 대해 중복 없이 한 줄만 남기고 싶을 때
- 복잡한 집계 없이 간단히 중복을 제거하고 싶다면 GROUP BY보다 간단하고 직관적이다
🎯 배운 점 2: GROUP BY는 왜 한 줄만 출력할까?
GROUP BY는 지정한 컬럼을 기준으로 같은 값을 가진 행들을 하나의 그룹으로 묶고,
그룹당 요약된 한 줄만 출력하는 방식이다.
예를 들어:
SELECT category, SUM(amount)
FROM sales
GROUP BY category;
이렇게 하면 category별로 묶어서 하나의 합산 결과만 남게 된다.
그리고 SELECT에는 그룹 기준 컬럼이나 SUM, COUNT, MAX 같은 집계 함수만 사용 가능하다.
다른 컬럼을 쓰면 SQL이 "그 중 어떤 값을 보여줘야 할지"를 몰라서 오류가 발생한다.
⚠️ 배운 점 3: 한 ID에 여러 정보가 있을 때, 최신 정보 기준으로 판단해야 한다
예를 들어 CAR_ID = 2에 다음과 같은 대여 이력이 있다고 하자:
CAR_ID | START_DATE | END_DATE |
2 | 2022-09-01 | 2022-09-10 |
2 | 2022-10-10 | 2022-10-20 |
이럴 때 단순히 GROUP BY나 MIN, MAX를 쓰면 과거 이력을 기준으로 판단할 수 있다.
하지만 우리가 원하는 건 현재 시점 기준의 상태이기 때문에
"2022-10-16"에 해당하는 조건을 직접 만족하는 행이 있는지를 IN (SELECT ...) 방식으로 따져줘야 정확하게 판단할 수 있다.
✅ 오늘의 정리
개념정리
DISTINCT | 중복 제거. ID별 한 줄 출력이 필요할 때 사용 |
GROUP BY | 같은 그룹을 묶고 요약. SELECT엔 그룹 기준 또는 집계 함수만 사용 가능 |
ID에 여러 정보가 있을 때 | 최신 정보 기준 판단이 필요할 경우 조건을 명확하게 걸어야 한다 |
날짜 비교 | '날짜' BETWEEN START_DATE AND END_DATE 로 깔끔하게 처리 가능 |
'SQL 코딩연습' 카테고리의 다른 글
삼중쿼리와 where ~ in 구문 (0) | 2025.04.03 |
---|---|
SQL 코딩 연습 (0) | 2025.04.03 |