본문 바로가기

SQL/CODING TEST

[programmers] 식품분류별 가장 비싼 식품의 정보 조회하기

728x90

문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/131116
 

프로그래머스

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

programmers.co.kr

 

풀이 과정

문제

혼자 풀어보니 자꾸 오류가 나서 왜 그럴까 고민해 보았더니 GROUP BY, MAX를 하면 PRODUCT_NAME 이 사라지게 된다.

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

 

이를 해결하기 위해 여러가지 풀이를 찾아보고 해결하였다

 

< Group By 최대값을 가진 Row를 추출하는 쿼리 >

SELECT a.CATEGORY, a.PRICE as MAX_PRICE, a.PRODUCT_NAME
FROM FOOD_PRODUCT a
LEFT JOIN FOOD_PRODUCT b
ON a.CATEGORY = b.CATEGORY AND a.PRICE < b.PRICE
WHERE b.CATEGORY IS NULL AND a.CATEGORY IN ('과자','국','김치','식용유')
ORDER BY 2 desc;
  • Group By 키워드를 사용하지 않고 최대값을 찾는 쿼리
  • Self Left Join을 통해 가지고 올수 있다.
  • `b.category`가 NULL 이라면 `a.category`가 최대값이기 때문에 최대값을 가진 row값을 추출을 할수가 있다.

 

< 서브쿼리를 이용한 풀이 >

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

 

< PARTITION BY 를 이용한 풀이 >

-- 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회
-- 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력
SELECT A.CATEGORY, A.MAX_PRICE, A.PRODUCT_NAME
FROM (SELECT CATEGORY, PRICE,
      MAX(PRICE) OVER (PARTITION BY CATEGORY) MAX_PRICE, PRODUCT_NAME
      FROM FOOD_PRODUCT
      WHERE CATEGORY IN ('과자', '국', '김치', '식용유')) A
WHERE A.MAX_PRICE = A.PRICE
ORDER BY 2 DESC;

 

 

출처

GROUP BY 키워드를 사용하지 않고 최대값을 찾는 쿼리

https://helloino.tistory.com/120

 

문제

https://school.programmers.co.kr/questions/74520

https://school.programmers.co.kr/questions/75429

728x90

'SQL > CODING TEST' 카테고리의 다른 글

[programmers] 대장균의 크기에 따라 분류하기 1  (0) 2024.05.23