정답코드
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM rest_info
WHERE (food_type, favorites) IN (SELECT food_type, max(favorites)
FROM REST_INFO
GROUP BY FOOD_TYPE)
ORDER BY food_type desc;
설명
아마도 이 글을 클릭 한 사람이라면, 아래와 같이 코드를 짜서 오류가 났을 가능성이 클 것같다.
SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) AS FAVORITES
from rest_info
GROUP BY FOOD_TYPE
ORDER BY food_type desc;
이렇게 짜게 되면, FOOD_TYPE에 따른 MAX(FAVORITES)값, 즉 즐겨찾기가 가장 많은 값을 가져올 순 있다. 실행을 시키면 아래와 같은 결과가 나온다.
하지만, 이러면 문제가 MAX(FAVORITES)와 REST_NAME이 매칭이 되지 않는다는 점이다. 이유는 GROUP BY을 FOOD_TYPE으로 묶으면, 기본적으로 한식의 맨 첫번째, 일식의 맨 첫번째 ... 를 가져오게 되기 때문이다.
SELECT *
FROM REST_INFO;
이렇게 테이블을 모두 불러오게 되면, 아래와 같이 '하이가쯔네'라는 식당은 FAVORITES가 112라는 걸 알 수 있다. 즉, 위 결과와 매칭이 되지 않는다.
이를 해결하기 위해서는 WHERE절과 서브쿼리를 써야한다. 아래의 쿼리문을 실행시켜 보면, FOOD_TYPE에 따른 가장 FAVORITES이 높은 값을 불러올 수 있는데, 이 데이터를 원본 테이블에 매칭 시켜주면 된다.
SELECT food_type, max(favorites)
FROM REST_INFO
GROUP BY FOOD_TYPE;
매칭을 하기 위해 WHERE절을 써야하고, IN 안에 위 서브쿼리를 사용함으로써 위 결과와 똑같은 테이블만 불러오게끔 할 수 있다. 그러면 최종적으로 아래와 같은 결과를 얻을 수 있다.
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM rest_info
WHERE (food_type, favorites) IN (SELECT food_type, max(favorites)
FROM REST_INFO
GROUP BY FOOD_TYPE)
ORDER BY food_type desc;
'코딩테스트 > SQL 코테' 카테고리의 다른 글
[프로그래머스 SQL]조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (0) | 2023.08.08 |
---|---|
[프로그래머스 SQL] 오랜 기간 보호한 동물(2) (0) | 2023.08.07 |
[프로그래머스 SQL] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2023.08.03 |
[프로그래머스 SQL] 자동차 평균 대여 기간 구하기 (1) | 2023.08.02 |
[프로그래머스 SQL] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2023.07.31 |
댓글