[프로그래머스] 중복제거(DISTINCT/GROUP BY)

박경희·2024년 1월 3일

코딩테스트

목록 보기
16/69

문제1 - 오랜 기간 보호한 동물(2)

SELECT i.ANIMAL_ID, i.NAME
from ANIMAL_INS i 
inner join ANIMAL_OUTS o on i.animal_id = o.animal_id
where datediff(o.datetime, i.datetime)
order by datediff(o.datetime, i.datetime) desc
limit 2
  • datediff를 사용하여 날짜의 사이값을 구했다.
ditediff(날짜1, 날짜2)
  • 기본적으로 날짜1 - 날짜2 로 계산된다.

  • 정렬 조건으로도 사용 할 수 있다~!


문제2 - 조건에 맞는 사용자와 총 거래금액 조회하기

SELECT u.user_id, u.nickname, sum(b.price) as TOTAL_SALES
from USED_GOODS_BOARD b join USED_GOODS_USER u on b.writer_id = u.user_id
where b.status = 'done'
group by u.nickname
order by total_sales
  • 70만원 조건을 넣지 않고 이렇게 조회하면 70만원 이상인 금액이 3개 조회되지만 where절에 조건을 추가하면 2명만 조회된다.
  • WHERE절에서 b.price >= 700000 조건을 추가하면, 개별 거래(USED_GOODS_BOARD의 price 컬럼)가 70만 원 이상인 경우에만 결과에 포함되기 때문이다.
  • HAVING 절을 사용하여 그룹화된 결과의 총 거래금액에 대한 조건을 지정할 수 있다.
  • HAVING 절은 GROUP BY 절의 결과에 조건을 적용할 때 사용된다.
  • group by 에서도 u.nickname만 아니라 u.user_id를 함께 사용하는 것이 안전하다.
    이렇게 해야 DBMS에서의 호환성을 높이고, 의도치 않은 결과를 방지할 수 있다.
SELECT u.user_id, u.nickcame, sum(b.price) as TOTAL_SALES
from USED_GOODS_BOARD b join USED_GOODS_USER u on b.writer_id = u.user_id
where b.status = 'done'
group by u.nickname, u.user_id
having sum(b.price) >= 700000
order by total_sales

문제3 - 대여 기록이 존재하는 자동차 리스트 구하기

SELECT DISTINCT c.car_id
from CAR_RENTAL_COMPANY_CAR c join CAR_RENTAL_COMPANY_RENTAL_HISTORY h
on c.car_id = h.car_id
where h.start_date like '____-10-__%' and c.car_type = '세단'
order by 1 desc
MONTH(h.START_DATE) = 10 //이렇게도 가능하다.
  • 처음에는 DISTINCT가 아닌 group by를 사용했다. 결과는 맞는 것 같았으나 계속 정답으로 인정되지 않아 찾아봤다.

  • 중복을 제거하기 위한 의도로 GROUP BY를 사용하는 것보다 DISTINCT 키워드를 사용하는 것이 더 적절하다고 한다.

why??

GROUP BYDISTINCT는 비슷해 보일 수 있지만, 사용 목적과 작동 방식에서 중요한 차이가 있다.

DISTINCT

  • DISTINCT는 선택된 컬럼들에서 중복된 값을 제거하는 데 사용된다.
    (주로 결과 집합에서 고유한 레코드만을 추출할 때 사용)
SELECT DISTINCT column1, column2 FROM table;

와 같이 사용되며, column1column2의 조합에서 중복을 제거한다.
이렇듯 DISTINCT는 단순히 결과 집합에서 중복을 제거할 목적으로 사용된다.

GROUP BY

  • GROUP BY는 집계 함수(SUM, COUNT, AVG 등)와 함께 사용되어, 특정 컬럼을 기준으로 그룹화하고 각 그룹에 대해 집계를 수행한다.

예를 들어,

  SELECT column, COUNT(*) FROM table GROUP BY column;

과 같이 사용되어, column의 각 고유값에 대한 레코드 수를 계산한다.

  • GROUP BY는 결과 집합을 특정 기준으로 그룹화하고, 그룹별로 집계 함수를 적용할 때 사용된다.
  • 따라서 이 문제에서 중복 제거의 목적에 맞게 DISTINCT가 더 명확한 결과를 도출할 수 있다.

정리

  • 중복을 제거하는 것이 주 목적이라면 DISTINCT를 사용하고

  • 그룹별 집계를 목적으로 할 때는 GROUP BY를 사용 하자


0개의 댓글