주어진 문제는 다음과 같다.
내가 쓴 정답은 다음과 같다.
select USER_ID, PRODUCT_ID
from ONLINE_SALE
group by USER_ID, PRODUCT_ID
having count(*) >= 2
order by USER_ID, PRODUCT_ID desc;
우선 group by와 having은 무엇인가.
group by는 다수의 열(column)을 하나로 묶는다는 뜻이다.
group by 그룹화할 컬럼 나열;
group by USER_ID, PRODUCT_ID
having은 group by의 조건을 추가하는 용도로 사용했다.
여기서 count(*)은 행의 개수를 세는 함수다.
having 조건식
having count(*) >= 2
위의 정답에서 그룹화를 한 이유는 다음과 같다.
- 재구매를 했다는 것은, 회원id와 상품id가 같은 행이 2개 이상이어야 한다.
- 회원id, 상품id를 하나로 묶어 중복조회 하는 것이 더 쉽다.
한 줄씩 해석해보자면
select USER_ID, PRODUCT_ID
// 찾는 항목은 USER_ID와 PRODUCT_ID 이다.
from ONLINE_SALE
// ONLINE_SALE 이라는 테이블에서 찾을 것이며,
group by USER_ID, PRODUCT_ID
// 중복 조회를 위해 USER_ID, PRODUCT_ID 을 묶어서 하나의 열로 묶고,
having count(*) >= 2
// 2개 이상인 항목을 찾아라(재구매 하였다면).
order by USER_ID, PRODUCT_ID desc;
// 결과를 USER_ID 오름차순으로 나열, 같으면 PRODUCT_ID 내림차순 나열.