728x90
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
GROUP BY와 DISTINCT를 사용해서 푸는 문제.
문제를 보자마자 어떻게 쿼리를 작성해야 할지 바로 떠오르지 않았고, 생각할 시간이 필요했던 문제였어서 포스팅한다.
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Milk' or NAME = 'Yogurt'
GROUP BY CART_ID
HAVING COUNT(DISTINCT(NAME)) >= 2
ORDER BY 1
이 문제를 푸는데 필요한 핵심 로직은
HAVING COUNT(DISTINCT(NAME)) >= 2
이 부분이다.
Milk와 Yogurt를 모두 구매한 장바구니를 찾아야 한다.
그래서 WHERE문에서 OR 조건을 통해 Milk와 Yogurt가 들어있는 장바구니 데이터들을 먼저 뽑아낸 후에,
GROUP BY CART_ID를 통해 CART_ID로 묶어준다.
여기서 묶어줄 때, DISTINCT(NAME)의 개수가 2개 이상인 경우, 즉 Yogurt, Milk를 가지고 있는 경우에만 그룹화시켜서 그 경우의 CART_ID를 조회하면 된다.
풀이를 적으면서 생각난 건데, HAVING문을
HAVING COUNT(DISTINCT(NAME)) = 2
이렇게 바꿔주는게 더 낫다.
어차피 WHERE문에서 NAME이 Yogurt와 Milk인 경우에 대해서만 그룹화하므로 COUNT(DISTINCT(NAME))이 2보다 큰 경우는 없기 때문이다.
수정된 풀이는 다음과 같다.
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Milk' or NAME = 'Yogurt'
GROUP BY CART_ID
HAVING COUNT(DISTINCT(NAME)) = 2
ORDER BY 1
DISTINCT를 사용하는 문제들은 아직까지 바로 쿼리가 생각나지 않는다.
계속 풀어보면서 익숙해져야겠다.
728x90
'알고리즘 > SQL' 카테고리의 다른 글
[프로그래머스] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2024.07.16 |
---|---|
[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기 (0) | 2024.07.11 |
[프로그래머스] 특정 세대의 대장균 찾기 (0) | 2024.07.09 |
[프로그래머스] 입양 시각 구하기(2) (0) | 2024.07.08 |
[프로그래머스] 년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2024.06.27 |