다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과 같으며 REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.
문제
REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.
처음에는 GROUP BY와 HAVING을 이용해서 풀어야 하나 했지만 그게 아니었다..!
GROUP BY
같은 값을 가진 행들을 하나로 묶어서 각 그룹마다 집계값을 계산할 때 쓴다
때문에 집계가 안 되는 것들을 출력할 수 없다
예를 들어 이 문제에서는 음식 종류 별 즐겨찾기 수가 가장 많은 식당의 종류와 즐겨찾기 수 뿐만 아니라 ID, 식당 이름 등은 어떤 걸 출력해야 할지 몰라서 에러가 난다.
ROW_NUMBER() OVER (PARTITION BY)
그룹을 요약하지 않고 순위만 붙여주기 때문에 원하는 것을 다 출력할 수 있다.
전체를 다 출력하지 않고 상위 n개만 뽑고 싶다면 이후에 where절을 써서 잘라준다.
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM
(SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES,
ROW_NUMBER() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) as rn
FROM REST_INFO
) t
WHERE rn=1
ORDER BY FOOD_TYPE DESC
나는 순위를 따로 출력하고 싶지 않으니 서브쿼리를 써준다.
음식 종류 별 좋아요 순으로 정렬하고 -> 서브쿼리
그 중 좋아요가 제일 많은 식당을 음식 종류 별로 하나씩 뽑은 후 -> Where rn=1
다시 음식 종류 별로 내림차순 정렬 해준다 -> ORDER BY FOOD_TYPE DESC

다음과 같이 잘 출력되었다.
오랜만에 하려니 partition by가 기억이 안 나서 어려웠는데 비슷한 문제를 많이 풀어봐야겠다..!