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

 

프로그래머스

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

programmers.co.kr

코드설명

MAX + NESTED SUBQUERY 를 활용합니다.

 

만약 그룹화된 함수를 사용하여 집계함수를 사용한다면, GROUP BY 를 사용해야하겠지만 단순히 하나의 테이블에서 최댓값을 구할때는 바로 적용하면 됩니다.

 

NESTED SUBQUERY는 WHERE 절 안에 들어간 SUBQUERY를 의미합니다.

정렬을 통해서도 사용해도되겠지만, 인덱스가 없을경우 해당 경우의 속도는 느릴것으로 예상되어 단순히 값을 가져와서 처리합니다.

 

만약, 서브쿼리를 사용하기 싫다면, LIMIT 1 으로 가격기준 내림차순 정렬하면 되겠지만, 더 직관적인 코드는 이번 코드라고 생각됩니다.

코드

-- 코드를 입력하세요
SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT);
SELECT FP1.PRODUCT_ID, FP1.PRODUCT_NAME, FP1.PRODUCT_CD, FP1.CATEGORY, FP1.PRICE
FROM FOOD_PRODUCT AS FP1
WHERE FP1.PRICE = (select max(fp2.price) from food_product as fp2)

 

 

ORACLE

여러가지 풀이가 가능합니다.

1. NESTED SUB QUERY 

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

 

2. TOP-N 쿼리 : 만약, 가격이 같은데 비싼. 즉, 6500원 짜리가 3개 있다면 이 방식은 사용하지 못합니다.

SELECT * FROM (
    SELECT FP.PRODUCT_ID, FP.PRODUCT_NAME, FP.PRODUCT_CD, FP.CATEGORY, FP.PRICE
    FROM FOOD_PRODUCT FP
    ORDER BY FP.PRICE DESC
)
WHERE ROWNUM = 1

 

2-1. 위의 단점을 피할려면 어떻게 해야할까요?

TOP-N QUERY 와 RANK() WINDOW FUNCTION을 함께 사용합니다.

SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM (
    SELECT FP.PRODUCT_ID, FP.PRODUCT_NAME, FP.PRODUCT_CD, FP.CATEGORY, FP.PRICE, RANK() OVER (ORDER BY PRICE DESC) AS PRICE_RANK
    FROM FOOD_PRODUCT FP
)
WHERE PRICE_RANK = 1

 

 

저는 처음에 WINDOW FUNCTION은 WHERE절이 모두 끝나고 구현된다는 점을 몰랐었기에 TOP-N QUERY 를 사용하지 않고, 아래와 같이 사용하면 되는것 아닌가? 라고 생각했습니다.

하지만, WHERE 절 이후 PRICE_RANK COLUMN이 생성되는 것이기에 아래 코드는 오류가 납니다.

SELECT FP.PRODUCT_ID, FP.PRODUCT_NAME, FP.PRODUCT_CD, FP.CATEGORY, FP.PRICE, RANK() OVER (ORDER BY PRICE DESC) AS PRICE_RANK
    FROM FOOD_PRODUCT FP
WHERE PRICE_RANK = 1

 

+ Recent posts