문제
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;