문제 설명
- FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요.
- 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고
- 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.
테이블 설명
다음은 식품의 정보를 담은 FOOD_PRODUCT 테이블입니다. FOOD_PRODUCT 테이블은 다음과 같으며 PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE는 식품 ID, 식품 이름, 식품코드, 식품분류, 식품 가격을 의미합니다.
예시)
쿼리 작성
◆ MAX() KEEP(DENSE_RANK FIRST) 구문을 사용하여 해결
CATEGORY별 PRICE 기준 내림차순 1위 행에 대한 PRICE와 PRODUCT_NAME을 구할 수 있습니다.
해당 구문의 장점은 서브쿼리를 사용하지 않아도 결과를 추출할 수 있습니다. 즉 SELF JOIN 이나 VIEW 가 필요 없이 더 좋은 성능으로 사용할 수 있기 때문에 익혀두시면 실무에서도 종종 써먹기 좋더라구
SELECT CATEGORY,
MAX(PRICE) KEEP(DENSE_RANK FIRST ORDER BY PRICE DESC) MAX_PRICE,
MAX(PRODUCT_NAME) KEEP(DENSE_RANK FIRST ORDER BY PRICE DESC) PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
GROUP BY CATEGORY
ORDER BY 2 DESC
◆ 여기서 MAX() 함수만 사용한다면 결과가 동일할까?
→ MAX_PRICE는 동일하나, PRODUCT_NAME의 결과가 달라지게 됩니다.
그 이유는 단순히 MAX(PRODUCT_NAME)가 실행되게 되면, 문자열의 MAX 비교가 되어 데이터베이스가 해당 열에 정의한 정렬 순서에서 가장 높은 값을 찾게 됩니다. 즉, 문자열 정렬 순서가 가장 큰 상품명들이 나오게 되는 것이죠.
SELECT CATEGORY,
MAX(PRICE) MAX_PRICE,
MAX(PRODUCT_NAME) PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
GROUP BY CATEGORY
ORDER BY 2 DESC
◆ ROW_NUBMER 을 사용하여 해결하는 방법
MAX() KEEP (DENSE_RANK) 함수를 사용하지 않고, ROW_NUBMER 구문으로 해결할 수 있습니다. 전 이 방법이 먼저 떠오르더라구요. 결과는 MAX() KEEP(DENSE_RANK) 구문과 동일하게 출력됩니다.
쿼리를 해석해보자면 CATEGORY별 PRICE 별로 번호를 부여한 뒤 인라인 뷰 바깥쪽 조건으로 NUM=1을 넣어 가장 비싼 상품의 정보만 남기는 방법입니다.
SELECT CATEGORY,
PRICE MAX_PRICE,
PRODUCT_NAME
FROM
(
SELECT CATEGORY,PRODUCT_NAME,PRICE,
ROW_NUMBER()OVER(PARTITION BY CATEGORY ORDER BY PRICE DESC) AS NUM
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
)
WHERE NUM=1
ORDER BY 2 DESC
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr