https://school.programmers.co.kr/learn/courses/30/lessons/131536
문제 설명
- Lv 2의 문제
- 동일한 회원이 동일한 상품을 재구매한 데이터 출력
- 재구매한 회원 ID, 재구매한 상품 ID 출력
- 결과는 회원 ID 기준으로 오름차순, 회원 ID가 같다면 상품 ID 기준으로 내림차순 정렬
문제 풀이
1) SELF JOIN 사용
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, A.PRODUCT_ID DESC;
◼️ONLINE_SALE 테이블 셀프 조인
- 셀프 조인 : 같은 테이블을 조인하는 것
- 조인 조건은 두 테이블의 USER_ID가 같고, PRODUCT_ID가 같다.
- WHRE 절에서 ONLINE_SALE_ID 컬럼이 같지 않은 데이터만 조회하도록 한다.
◼️DISTINCT로 중복 제거
- 셀프 조인으로 중복 데이터가 발생하기 때문에, DISTINCT로 중복을 제거
◼️ORDER BY 로 USER_ID 기준 오름차순, PRODUCT_ID 기준 내림차순 정렬
2) GROUP BY 사용
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) > 1
ORDER BY USER_ID, PRODUCT_ID DESC;
◼️USER_ID, PRODUCT_ID 별 그룹화
- USER_ID(회원 ID), PRODUCT_ID(상품 ID) 으로 그룹화 → 회원별로 구매한 상품별로 묶을 수 있다.
- COUNT 함수로 그룹화한 행 중에서 각 행의 개수가 1개 이상인 경우에만 출력 → 특정 회원 A가 특정 상품 a를 구매한 횟수가 2 이상
◼️ORDER BY 로 USER_ID 기준 오름차순, PRODUCT_ID 기준 내림차순 정렬
✔️실패한 이유
JOIN을 사용해서 조회할 경우, DISTINCT 로 중복 제거를 해주어야 한다.
'PS > SQL' 카테고리의 다른 글
[프로그래머스][SQL] 연도별 대장균 크기의 편차 구하기 (0) | 2024.06.19 |
---|---|
[프로그래머스][SQL] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2024.06.19 |
[프로그래머스][SQL] 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 (0) | 2024.06.18 |
[프로그래머스][SQL] 조건에 부합하는 중고거래 상태 조회하기 (0) | 2024.06.18 |
[프로그래머스][SQL]업그레이드 할 수 없는 아이템 구하기 (0) | 2024.06.11 |