TIL

[SQL] 카테고리 별 최대값 정보 가져오기 2

ollive 2024. 7. 3. 21:16

어제 풀었던 카테고리 별 최대값 정보 가져오기 문항을 SUBQUERY를 활용하여 풀어보고자 한다. 방법은 다음과 같다.

  1. 카테고리별 최대값을 해당 항목만 가져와서 추출한다
  2. 1.의 데이터를 서브쿼리로 만들고 () as A뒤에 별명을 지정한다.
  3. 원래의 데이터에서 서브쿼리에 일치하는 행만 추출한다. 이때 1.에서 사용한 모든 column이 일치하도록 on 에 and를 사용하여 설정해준다. 예를 들면 (서브쿼리) as A JOIN table 1 ON a.col1 = 1.col1 AND a.col2 = 1.col2,,,
  4. 문제에서 제시한 column들을 select에 적어주고 이후 조건들을 설정하여 해결한다.
 

[SQL] 카테고리 별 최대값 정보 가져오기 (rank)

REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해

untilfull.tistory.com

 

<문제 1>

REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.

<RANK 풀이>

select FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
from (
	 select FOOD_TYPE, 
    		REST_ID, 
            REST_NAME, 
            FAVORITES, 
            rank() over(partition by food_type order by favorites desc) ranking
	from rest_info) a
where ranking = 1
order by food_type desc

<SUBQUERY 이용 풀이>

SELECT a.FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM (SELECT FOOD_TYPE, MAX(FAVORITES) AS MFAVORITES
      FROM REST_INFO 
      GROUP BY FOOD_TYPE
     ) a 
     JOIN REST_INFO FO ON a.FOOD_TYPE=FO.FOOD_TYPE AND a.MFAVORITES=FO.FAVORITES
ORDER BY food_type desc

# 음식타입별 즐겨찾기가가 가장 많은 데이터를 가져오는 서브쿼리
SELECT FOOD_TYPE, MAX(FAVORITES)
FROM REST_INFO 
GROUP BY FOOD_TYPE

 

<문제2>

FOOD_PRODUCT 테이블에서 가격이 제일 비싼 식품의 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격을 조회하는 SQL문을 작성해주세요.

<RANK 풀이>

SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM(
SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE,
       RANK() OVER(ORDER BY PRICE DESC) RN
FROM FOOD_PRODUCT 
) A
WHERE RN =1

<SUBQUERY 이용 풀이>

SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE FROM FOOD_PRODUCT 
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT)

 

<문제3>

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

 

 

프로그래머스

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

programmers.co.kr

<RANK 풀이>

select CATEGORY, PRICE, PRODUCT_NAME
from 
(select CATEGORY, PRICE, PRODUCT_NAME, rank() over(partition by CATEGORY order by price desc) ranking
from FOOD_PRODUCT 
where CATEGORY regexp('과자|국|김치|식용유')
) a
where ranking = 1
order by price desc

<SUBQUERY 이용 풀이>

SELECT A.CATEGORY, MPRICE, PRODUCT_NAME
FROM (SELECT CATEGORY, MAX(PRICE) MPRICE
      FROM FOOD_PRODUCT 
      GROUP BY CATEGORY) A
JOIN FOOD_PRODUCT P ON A.CATEGORY=P.CATEGORY AND A.MPRICE=P.PRICE
WHERE A.CATEGORY IN ('과자','국','김치','식용유')
ORDER BY MPRICE DESC

#카테고리별 최대 가격을 추출하는 서브쿼리 
SELECT CATEGORY, MAX(PRICE) MPRICE
FROM FOOD_PRODUCT 
GROUP BY CATEGORY