본문 바로가기
카테고리 없음

[Lv.3 Oracle] 131123. 즐겨찾기가 가장 많은 식당 정보 출력하기

by 키튼햄 2023. 12. 11.

 

문제

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

 

 

 

 

풀이

조회해야할 컬럼 :  음식종류, ID, 식당이름, 즐겨찾기 수

테이블 :  REST_INFO

조건 :  음식종류별로 즐겨찾기수가 가장 많은 식당

정렬 :  음식종류 내림차순

 

조건에서 사용할 음식종류별로 즐겨찾기수가 가장많은 식당을 적용하기 위해서,

먼저 음식종류를 그룹으로 묶고 그 결과 즐겨찾기가 가장 많도록 내림차순 정렬을 해서 그 중 가장 맨 위에 있는 ROW를 조회하면 된다.

이때 정렬을 하기위해 ORDER BY 절을 사용해야 하므로 ROWNUM보다는 ROW_NUMBER()를 사용하는 것이 편하다.

ROW_NUMBER() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS rn

PARTITION BY로 음식종류를 그룹화하고 ORDER BY를 사용해 즐겨찾기수를 내림차순으로 정렬한 후 순번을 매긴다. 이때 전체 쿼리에 조건을 주기위해 이 쿼리를 다시 사용할 것이므로 별칭을 설정한다.

해당 쿼리는 전체 검색 결과를 도와주기 위한 하위부분을 조회하는 것이기 때문에 서브쿼리로 중첩한다.

FROM (
  SELECT
    REST_ID,
    REST_NAME,
    FOOD_TYPE,
    FAVORITES,
    ROW_NUMBER() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS rn
  FROM
    REST_INFO
) AS RankedFavorites

 

전체 쿼리에서는 SELECT문을 이용하여  FOOD_TYPE,  REST_ID,  REST_NAME,  FAVORITES 컬럼을 조회하고 , FROM 으로 서브쿼리를 작성, WHERE절의 조건으로 ROW_NUMBER()을 사용했던 결과에서 전체 결과를 나타낼 조건을 넣는다. 문제에서의 조건은 즐겨찾기가 가장 많은 순이므로 가장 위에 있는 순번인 rn = 1 이 조건이 된다.

그리고 FOOD_TYPE 을 내림차순(DESC)로 정렬하면 원하는 결과가 나온다.

 

 

 

 

코드

SELECT
  FOOD_TYPE,
  REST_ID,
  REST_NAME,
  FAVORITES
FROM (
  SELECT
    REST_ID,
    REST_NAME,
    FOOD_TYPE,
    FAVORITES,
    ROW_NUMBER() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS rn
  FROM
    REST_INFO
) AS RankedFavorites
WHERE
  rn = 1
ORDER BY
  FOOD_TYPE DESC;