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;