Dev Hyeri

◖코딩 테스트◗▬▬▬▬▬▬▬▬▬/프로그래머스

[SQL KIT](2024) 식품분류별 가장 비싼 식품의 정보 조회하기(설명/코드/정답)

_hyeri 2024. 1. 25. 21:51

 

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131116

 

정상 코드.

방법 1. 상관 서브 쿼리 사용

SELECT CATEGORY, PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT F
WHERE CATEGORY IN('과자', '국', '김치', '식용유')
      AND
      PRICE = (SELECT MAX(PRICE) 
               FROM FOOD_PRODUCT AS S 
               WHERE S.CATEGORY = F.CATEGORY)
ORDER BY PRICE DESC

 

방법 2. 윈도우 함수 사용 

SELECT CATEGORY, PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE CATEGORY IN('과자', '국', '김치', '식용유')
      AND
      PRICE IN (SELECT MAX(PRICE) OVER( PARTITION BY CATEGORY )
                FROM FOOD_PRODUCT) 
ORDER BY PRICE DESC

 

 

방법 2. 윈도우 함수 사용 

SELECT CATEGORY, PRICE, PRODUCT_NAME
FROM (
    SELECT CATEGORY, PRICE, PRODUCT_NAME,
           ROW_NUMBER() OVER (PARTITION BY CATEGORY ORDER BY PRICE DESC) AS RN
    FROM FOOD_PRODUCT
    WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
) INLINE
WHERE RN = 1
ORDER BY PRICE DESC;

 

 

내부 동작 순서 (방법2)

 

1. FROM 절

FOOD_PRODUCT 테이블을 기준으로 데이터를 가져옵니다.

 

2. WHERE 절

CATEGORY가 '과자', '국', '김치', '식용유' 중 하나이고, PRICE가 카테고리별로 최대 가격과 같은 행들을 필터링합니다.

 

(서브쿼리(SELECT MAX(PRICE) OVER(PARTITION BY CATEGORY) FROM FOOD_PRODUCT)에서 사용된 MAX() 함수는 각 카테고리 내에서 최대 가격을 찾습니다. 그리고 메인 쿼리에서는 이 결과와 매칭되는 행들을 선택하여 최종 결과를 반환합니다)

 

3. SELECT 절

필터링된 결과에서 CATEGORY, PRICE, PRODUCT_NAME 컬럼을 선택합니다.

 

4. ORDER BY 절

 PRICE를 기준으로 내림차순으로 정렬합니다.

 


초기 코드

SELECT CATEGORY, PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE CATEGORY IN('과자', '국', '김치', '식용유')
GROUP BY CATEGORY
HAVING MAX(PRICE)
ORDER BY PRICE DESC

 

=>오류 PRODUCT_NAME이 정답과 다르게 출력

 

 

 

1. HAVING 절 이해부족

--> 집계 함수를 기반으로 조건을 걸 때 사용. MAX(FAVORITES)가 어떤 조건과 함께 사용되었어야 함