SQL 이것저것

[MySQL] 데이터 내 중복 값들을 가진 인스턴스만 추출하기

pjw250 2024. 10. 10. 11:59

코딩테스트 연습 - 재구매가 일어난 상품과 회원 리스트 구하기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

보통 중복 값 제거는 쉽게 하는데 중복 값을 찾는 거는 처음 해봤다. 따라서 해당 노하우를 기록하고 공부하고자 한다.

위 예제 TABLE에서 USER_ID와 PRODUCT_ID 즉 다수 컬럼에 대한 중복 값을 찾고자 한다.

(문제에서는 한 유저가 동일한 상품을 재구매 한 것을 조회하라고 하였다.)

즉, A라는 사람이 1번 제품을 샀는데 이어서 혹은 다른 날에도 A라는 사람이 1번 제품을 샀다면 A와 1을 출력하는 문제이다. (몇 회 샀는지 까진 가지 않았다.)

내가 작성 했던 답안은 JOIN을 사용한 것 이지만 GROUP BY와 HAVING으로 풀이가 가능하다.

SELECT DISTINCT a.USER_ID, a.PRODUCT_ID
FROM ONLINE_SALE a
JOIN ONLINE_SALE b 
  ON a.USER_ID = b.USER_ID 
  AND a.PRODUCT_ID = b.PRODUCT_ID
WHERE a.ONLINE_SALE_ID <> b.ONLINE_SALE_ID
ORDER BY a.USER_ID ASC, a.PRODUCT_ID DESC;

 

 

GROUP BY와 HAVING으로 풀이가 가능하다.

SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >1
ORDER BY 1 ASC, 2 DESC;

 

두 번째 답안 처럼 GROUP BY HAVING을 이용해서 중복 값을 찾을 때 단일 컬럼과 다수 컬럼을 걸 수 있다.

단일 경우

SELECT column_name,
       COUNT(column_name)
FROM   table_name
GROUP  BY column_name
HAVING COUNT(column_name) > 1;

 

다수일 경우

SELECT column_a,
       column_b,
       COUNT(*)
FROM   table_name
GROUP  BY column_a,
          column_b
HAVING COUNT(*) > 1;