본문 바로가기
코딩테스트/프로그래머스

[프로그래머스 - SQL] 식품분류별 가장 비싼 식품의 정보 조회하기

by ordinary_daisy 2023. 8. 28.

문제 설명

 

- 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

[출처] 프로그래머스 SQL GROUP BY 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr