728x90
문제
-- FOOD_PRODUCT 테이블에서 -> SELECT
-- 식품분류별로 가격이 제일 비싼 식품의 -> RANK = 1
-- 분류, 가격, 이름을 조회 -> SELECT
-- 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력 -> WHERE
-- 결과는 식품 가격을 기준으로 내림차순 정렬 -> ORDER BY
풀이방법
1. RANK 함수를 이용한 방식
-- 핵심 문법
RANK() OVER(PARTITION BY CATEGORY ORDER BY PRICE DESC) AS FOOD_RANK
: RANK()를 이용해 FOOD_RANK컬럼을 만들거 줄 것이며,
PARTITION BY을 이용해 랭킹매길 그룹조건을, ORDER BY를 이용해 랭킹 순위 판정 기준을 세팅
* PARTITION BY를 사용해야한다. (GROUP BY 사용시 모든 카테고리중 지존 1위만 나옴)
2. MAX 함수를 이용한 방식
필터 조건에서 PRICE를 지정.
이때, PRICE에 대한 조건으로 서브쿼리 사용
서브쿼리에서 PRICE는 CATEGORY별 MAX값인 PRICE를 추출
나의 코드
RANK 함수를 이용해 구했다.
-- 메인쿼리로서 출력할 컬럼 선정
SELECT FP.CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME
-- 메인 테이블 선택
FROM FOOD_PRODUCT FP
-- 서브쿼리를 이용해 랭킹 컬럼을 만들어 JOIN.
-- 이때, 랭킹을 구하는 그룹조건은 GROUP BY가 아닌 PARTITION BY, 랭킹순위매기는 조건은 ORDER BY
INNER JOIN (
SELECT PRODUCT_ID, RANK() OVER(PARTITION BY CATEGORY ORDER BY PRICE DESC) AS FOOD_RANK
FROM FOOD_PRODUCT
) AS FPR ON FPR.PRODUCT_ID LIKE FP.PRODUCT_ID
-- JOIN해서 붙인 랭킹 컬럼에서 1위인 애들만 필터링, 카테고리가 원하는 카테고리만 나오게 필터링
WHERE
FPR.FOOD_RANK = 1
AND FP.CATEGORY IN ("과자", "국", "김치", "식용유")
-- 정렬 조건
ORDER BY FP.PRICE DESC
레퍼런스 코드
WHERE 조건에서 일일이 OR로 할당하지 않고, IN을 이용해 일괄 할당
SELECT CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE
PRICE IN (
SELECT MAX(PRICE) PRICE
FROM FOOD_PRODUCT
GROUP BY CATEGORY
)
AND CATEGORY IN ("과자", "국", "김치", "식용유")
ORDER BY PRICE DESC
참고 링크 : 링크
728x90
'알고리즘 저장소 (일반방식과 나만의 풀이) > SQL' 카테고리의 다른 글
[Programmers] no59413: 입양 시각 구하기(2) (0) | 2023.03.28 |
---|---|
[Programmers] no62284: 우유와 요거트가 담긴 장바구니 (0) | 2023.03.28 |
[Programmers] no131117: 5월 식품들의 총매출 조회하기 (0) | 2023.03.27 |
[Programmers] no131118: 서울에 위치한 식당 목록 출력하기 (0) | 2023.03.27 |
[Programmers] no131124: 그룹별 조건에 맞는 식당 목록 출력하기 (0) | 2023.03.27 |