목차
개요
코딩테스트 연습 - 재구매가 일어난 상품과 회원 리스트 구하기 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
간만에 조금 어려운 문제가 나왔다. 한 테이블에서 중복이 일어나는 것들을 뽑으라는 것이다.
문제의 조건을 읽어보면 동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 데이터만 있다 한다.
그렇지만 날짜만 다르고 동일한 회원 ID, 상품 ID 조합은 존재한다. 요컨대 고객이 물건을 재구매했다는 것이고 이러한 고객, 상품 쌍을 조회하라는 것이 문제.
이를 위해서는 GROUP BY를 때려야 한다. 동일한 고객과 상품 ID가 하나의 묶음의 기준이 되도록 넣어준다.
묶은 후에 COUNT가 1보다 큰 값을 찾는다. 동일한 고객, 동일한 상품인데 COUNT가 1보다 높다는 것은 재구매가 일어났다는 것을 뜻한다.
어떤 것에 대해 COUNT를 하는가? 나는 문제의 조건 상 SALES_DATE로 해줘야 한다고 판단을 했는데, 막상 해보니 뭘로 걸어도 상관이 없더라.
GROUP BY로 묶인 상태의 값들 중 고유한 값들을 사용해야 하니, ONLINE_SALE_ID, SALES_DATE만 쓸 수 있을 것이라 생각했는데.. 아니면 *로 쓰거나. 그냥 테스트 케이스가 적어서 아무렇게나 써도 정답 처리를 시켜주고 있는 것은 아닐까?
혹시 몰라 질문 글도 올려놨다.
참고로 GROUP BY에 대한 조건절을 걸 때는 HAVING으로 해주기.
코드
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(SALES_DATE) > 1
ORDER BY USER_ID, PRODUCT_ID DESC
;
'알고리즘 > 프로그래머스 풀이' 카테고리의 다른 글
[프로그래머스] 역순 정렬하기 (MySQL) (0) | 2023.02.19 |
---|---|
[프로그래머스] 오프라인/온라인 판매 데이터 통합하기 (MySQL) (0) | 2023.02.19 |
[프로그래머스] 모든 레코드 조회하기 (MySQL) (0) | 2023.02.19 |
[프로그래머스] 인기있는 아이스크림 (MySQL) (0) | 2023.02.19 |
[프로그래머스] 조건에 맞는 도서 리스트 출력하기 (MySQL) (0) | 2023.02.19 |