즐겨찾기가 가장 많은 식당 정보 출력하기

정민교·2024년 3월 23일
0

SQL프로그래머스

목록 보기
24/25

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;

풀이

식당 타입별로 묶은 후에 타입별로 가장 많은 즐겨찾기를 갖는 식당을 먼저 서브쿼리로 선별

타입과 즐겨찾기가 통일한 튜플을 찾아 조인하고 문제에 맞게 정렬하여 출력해준다.

포인트

  1. 타입과 MAX 즐겨찾기 수가 동일한 튜플이 존재한다면?

위 컬럼은 식당 타입과 즐겨찾기의 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;
profile
백엔드 개발자

0개의 댓글