https://school.programmers.co.kr/learn/courses/30/lessons/131536
코드설명
SELECT + GROUP BY + HAVING COUNT 를 활용하여 해결합니다.
동일한 사용자(USER_ID)가 동일한 제품(PRODUCT_ID)을 최소 2번 이상 구매한 경우의 데이터를 검색하는데 사용됩니다. 아래는 쿼리의 로직을 설명합니다:
- SELECT 문:
- USER_ID, PRODUCT_ID: 사용자 식별자와 제품 식별자를 선택합니다.
- FROM 문:
- FROM ONLINE_SALE: ONLINE_SALE 테이블에서 데이터를 가져옵니다.
- GROUP BY 문:
- GROUP BY USER_ID, PRODUCT_ID: 사용자와 제품에 대해 그룹화합니다. 이는 동일한 사용자가 동일한 제품을 여러 번 구매한 경우를 합치기 위함입니다.
- HAVING 문:
- HAVING COUNT(*) >= 2: 그룹화된 결과에서 행의 개수가 2 이상인 경우만 선택합니다. 즉, 동일한 사용자가 동일한 제품을 최소 2번 이상 구매한 경우를 필터링합니다.
- ORDER BY 문:
- ORDER BY USER_ID, PRODUCT_ID DESC: 사용자 식별자로 정렬하고, 동일한 사용자의 경우에는 제품 식별자를 내림차순으로 정렬합니다.
처음에는 문제 접근을 잘못했습니다.
이떄, GROUP BY OS.USER_ID를 진행할경우 테이블곱에 의해 중복값이 나옴.
INNER JOIN을 하여 테이블곱한뒤 진행했지만, 생각해보면 중복됨을 알 수 있습니다.
SELECT OS.USER_ID, OS.PRODUCT_ID, COUNT(*) AS COUNT
FROM ONLINE_SALE AS OS
INNER JOIN ONLINE_SALE AS OS2
ON OS.USER_ID = OS2.USER_ID AND OS.PRODUCT_ID = OS2.PRODUCT_ID
GROUP BY OS.USER_ID, OS.PRODUCT_ID
HAVING COUNT(*) >= 2 -- 이렇게 하면 사실 4개가 나오는것이다!
ORDER BY OS.USER_ID ASC, OS.PRODUCT_ID DESC
실제로,
실행시 2 레코드 모두 COUNT = 2 가 나와야하지만, INNER JOIN으로 인해 4개의 레코드가 GROUP BY 되면서 4가 나옵니다.
그대신에 GROUP BY USER_ID, PRODUCT_ID를 통해서 테이블 곱의 중복없이 구할 수 있습니다.
코드
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC;
SELECT OS.USER_ID, OS.PRODUCT_ID
FROM ONLINE_SALE AS OS
GROUP BY OS.USER_ID, OS.PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY OS.USER_ID ASC, OS.PRODUCT_ID DESC
ORACLE
SELECT OS.USER_ID, OS.PRODUCT_ID
FROM ONLINE_SALE OS
GROUP BY OS.USER_ID, OS.PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY OS.USER_ID ASC, OS.PRODUCT_ID DESC