SQL 코딩연습

DISTINCT와 한 ID가 여러 정보를 갖고 있을 때 주의할 점

mtepg924 2025. 4. 4. 16:41

오늘은 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