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

AI Scientist를 목표로!·2023년 1월 10일
0

프로그래머스 문제


테이블 구조

  • FOOD_PRODUCT 테이블

문제

FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.


문제 분석

  1. 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회

  2. 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력

  3. 결과는 식품 가격을 기준으로 내림차순 정렬


해결 방법

  • 식품분류 중 4가지만 출력

    WHERE category in ('과자','국','김치','식용유')
  • 식품분류별로 가격이 제일 비싼 식품을 조회하기 위해서 서브 쿼리가 필요

    WHERE (category,price) in 
            (SELECT category, max(price)
             FROM food_product
             WHERE category in ('과자','국','김치','식용유')
             GROUP BY category)
  • 정렬

    ORDER BY price DESC

최종 코드

SELECT category, price, product_name
FROM food_product
WHERE (category,price) in 
        (SELECT category, max(price)
         FROM food_product
         WHERE category in ('과자','국','김치','식용유')
         GROUP BY 1)
ORDER BY 2 DESC

RANK() OVER 함수 사용

SELECT RANK( ) OVER ( PARTITION BY 그룹핑할 칼럼 ORDER BY 정렬할 칼럼 )
FROM 테이블명
(ORDER BY 정렬할 칼럼 DESC or ASC or 생략하면 ASC가 디폴트값)

  PARTITION BY 에 지정한 칼럼 기준으로 그룹핑 해주고
  ORDER BY 에 지정한 칼럼 기준으로 정렬해준담에 
  RANK 행 마다 순위를 매겨준다  
  
  
SELECT category, price, product_name
FROM (
      SELECT *, RANK() OVER(PARTITION BY category
                            ORDER BY price desc) AS pr
      FROM food_product
      WHERE category in ('과자','국','김치','식용유')
     ) AS product
WHERE product.pr = 1
ORDER BY 2 DESC
  • ROWNUMBER() OVER (Partition by Order by _)와의 차이점

    ROW_NUMBER( ) : 1등이 2명이어도 1등, 2등으로 나눔

    RANK( ) : 1등이 2명이면 그 다음 순위는 3등으로 매김

profile
딥러닝 지식의 백지에서 깜지까지

0개의 댓글