문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
재정의
다음과 같이 테이블이 주어진다.
여기서 카테고리별로 가장 비싼 품목에 대해서 출력하면 되는 단순한 문제이다.
CATEGORY로 GROUP BY를 하고, MAX(PRICE)를 하면 손 쉽게 풀릴 것 같지만 그렇지 않다.
PRODUCT_NAME엔 집계 함수를 쓰지 못해 아마도 제일 처음 있는 값이랑 묶일 것이다.
MAX(PRODUCT_NAME)을 할 수도 없는 마당이다.
생각을 해보면, CATEGORY, MAX_PRICE가 정해지면 PRODUCT_NAME은 하나밖에 존재하지 않는다.
즉 3개 중에, 2개를 일치하는 경우를 뽑으면 일치 할 것이란 이야기.
WHERE
(CATEGORY, PRICE) IN
(
SELECT CATEGORY, MAX(PRICE)
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
GROUP BY CATEGORY
)
그래서 정답은 다음과 같이 귀결된다.
SELECT
CATEGORY,
PRICE AS MAX_PRICE,
PRODUCT_NAME
FROM
FOOD_PRODUCT
WHERE
(CATEGORY, PRICE) IN
(
SELECT CATEGORY, MAX(PRICE)
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
GROUP BY CATEGORY
)
ORDER BY
MAX_PRICE DESC
성급하게 GROUP BY를 쓰면 문제가 복잡해진다.
2개가 결정되면, 나머지는 자연스럽게 결정 되므로,
WHERE IN 다중조건으로 쉽게 해결할 수 있다.
피드백
GROUP BY를 메인쿼리에 할 지, 서브 쿼리에 할지를 생각하고,
특정 조건만 고려해도 자명하다면 WHERE IN을 활용 할것
'프로그래밍 언어 > MySQL' 카테고리의 다른 글
비트 연산 활용하기 (0) | 2024.02.22 |
---|---|
특정 단위로 테이블 만들기 (0) | 2024.02.21 |
서브 테이블로 복잡한 쿼리 풀기 (0) | 2024.02.11 |
서브 쿼리로 데이터 끼워 넣기 (0) | 2024.02.11 |
SQL 코딩 테스트 훈련 (0) | 2024.02.08 |