https://school.programmers.co.kr/learn/courses/30/lessons/131536

 

프로그래머스

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

programmers.co.kr

코드설명

SELECT + GROUP BY + HAVING COUNT 를 활용하여 해결합니다.

 

동일한 사용자(USER_ID)가 동일한 제품(PRODUCT_ID)을 최소 2번 이상 구매한 경우의 데이터를 검색하는데 사용됩니다. 아래는 쿼리의 로직을 설명합니다:

 

  1. SELECT 문:
    • USER_ID, PRODUCT_ID: 사용자 식별자와 제품 식별자를 선택합니다.
  2. FROM 문:
    • FROM ONLINE_SALE: ONLINE_SALE 테이블에서 데이터를 가져옵니다.
  3. GROUP BY 문:
    • GROUP BY USER_ID, PRODUCT_ID: 사용자와 제품에 대해 그룹화합니다. 이는 동일한 사용자가 동일한 제품을 여러 번 구매한 경우를 합치기 위함입니다.
  4. HAVING 문:
    • HAVING COUNT(*) >= 2: 그룹화된 결과에서 행의 개수가 2 이상인 경우만 선택합니다. 즉, 동일한 사용자가 동일한 제품을 최소 2번 이상 구매한 경우를 필터링합니다.
  5. 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

 

+ Recent posts