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

쥬쥬스·2023년 8월 24일
0

SQL

목록 보기
46/67
post-thumbnail

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

💡 조건

  • 식품분류별로 group화 하기
  • 그 중에서 제일 비싼 식품 조회
  • 분류, 가격, 이름 조회
  • 식품 분류가 '과자', '국', '김치', '식용유'인 경우
  • 식품 가격 기준으로 내림차순

만만하게 보고 큰코 다침 ㅠ group by하면 맨 위 값이 조회된다는걸 ㅋㅋ..ㅠ
구글링도 하고, 프로그래머스 다른 사람들 풀이도 같이 보면서 내가 해볼 수 있는 쿼리문을 작성해둔다.


sql 코드

1. ROW_NUMBER() 사용

SELECT category, price, product_name
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY category ORDER BY price DESC) as RowIdx
     FROM food_product
     WHERE category in('과자', '국', '김치', '식용유')) as food_product
WHERE RowIdx = 1
ORDER BY price desc

이 문제를 통해 처음 알게된 함수고 밑의 두개를 참고해서 적용했다.
그룹별 최고값 가져오기
ROWNUM 사용법 정리

SELECT *, ROW_NUMBER() OVER(PARTITION BY category ORDER BY price DESC) as RowIdx
FROM food_product

해당 쿼리문을 실행시키면 아래 화면과 같이 RowIdx 컬럼이 생성되면서 번호가 부여된다.

살짝 설명을 써두면,
PARTITION BY category 카테고리별로 파티션을 지정(그룹을 나눈다)
ORDER BY price DESC 그렇게 묶은 파티션들은 금액으로 내림차순
ROW_NUMBER() OVER 라벨링을 시켜준다
as RowIdx 그렇게 라벨링 된 숫자들은 RowIdx 컬럼에 저장한다
FROM food_product 해당 테이블에서 가져온 데이터로 진행


FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY category ORDER BY price DESC) as RowIdx
     FROM food_product
     WHERE category in('과자', '국', '김치', '식용유')) as food_product

이렇게 작성한 쿼리문은 하나의 테이블화 되기 때문에 as를 사용해서 테이블명을 작성해준다. as를 빼먹으면

SQL 실행 중 오류가 발생하였습니다.
Every derived table must have its own alias

해당 오류가 발생한다!!!!!!!

WHERE RowIdx = 1

그리고나서 가장 큰 값을 가지는 행들을 가져와야하므로 첫번째로 라벨링해준 값 RowIdx=1 을 사용하여 가져온다.


2. 서브쿼리 사용

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

서브쿼리를 사용한 부분만 가져와서 설명을 적어둔다.

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

서브쿼리에서 카테고리로 그룹화하고 카테고리랑 가장 큰 값을 가져오는데, 여기서! 이거에 맞는 것만 join해서 뽑아준다. 카테고리가 같은것과 금액이 같은 것. 하나만 맞는 것을 가져오면 max 금액인데 그 금액에 맞지 않는 name이 출력된다. 가장 위값이 출력되는 것. 그러니 맞는 행을 가져오려면 조건들을 잘 붙여줘야된다.

profile
느려도... 꾸준히.....🐌

0개의 댓글