https://school.programmers.co.kr/learn/courses/30/lessons/131123
SELECT
REST_INFO.FOOD_TYPE,
REST_INFO.REST_ID,
REST_INFO.REST_NAME,
RESt_INFO.FAVORITES
FROM
REST_INFO
JOIN (
SELECT
FOOD_TYPE, MAX(FAVORITES) AS MAX_FAVORITES
FROM
REST_INFO
GROUP BY
FOOD_TYPE
) AS MAX_FAVORITES_INFO
ON REST_INFO.FOOD_TYPE = MAX_FAVORITES_INFO.FOOD_TYPE AND
REST_INFO.FAVORITES = MAX_FAVORITES_INFO.MAX_FAVORITES
ORDER BY
REST_INFO.FOOD_TYPE DESC;
식당 타입별로 묶은 후에 타입별로 가장 많은 즐겨찾기를 갖는 식당을 먼저 서브쿼리로 선별
타입과 즐겨찾기가 통일한 튜플을 찾아 조인하고 문제에 맞게 정렬하여 출력해준다.
위 컬럼은 식당 타입과 즐겨찾기의 MAX 값이 동일한 식당이 여러 개 존재하는 경우는 없는 조건으로 보인다.
하지만 여러 개 존재하는 경우에는 추가적인 조건에 따라 하나만 선별할 수도 있다.
만약 가장 높은 즐겨찾기 수를 가지며 아이디가 가장 낮은 식당 하나만 찾도록 조건이 주어진다면 다음과 같이 쿼리를 작성할 수 있다.
WITH RankedRestaurants AS (
SELECT
REST_INFO.FOOD_TYPE,
REST_INFO.REST_ID,
REST_INFO.REST_NAME,
REST_INFO.FAVORITES,
ROW_NUMBER() OVER (
PARTITION BY REST_INFO.FOOD_TYPE
ORDER BY REST_INFO.FAVORITES DESC, REST_INFO.REST_ID
) AS Rank
FROM
REST_INFO
)
SELECT
FOOD_TYPE,
REST_ID,
REST_NAME,
FAVORITES
FROM
RankedRestaurants
WHERE
Rank = 1
ORDER BY
FOOD_TYPE DESC;