REST_INFO 테이블에서 음식종류 별로 즐겨찾기 수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기 수를 조회하는 SQL문을 작성해주세요. 이 때, 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.
오답코드
SELECT
FOOD_TYPE,
REST_ID,
REST_NAME,
MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC
위 코드를 실행하면 GROUP BY로 FOOD_TYPE 별 FAVORITES의 최대값은 가져올 수 있지만 REST_ID와 REST_NAME은 정확히 가져올 수 없다. GROUP BY가 임의로 아무 행이나 가져오게 된다.
GROUP BY가 그룹 기준 컬럼인 FOOD_TYPE과 집계함수 MAX에 사용된 FAVORITES는 정확히 인지하지만 나머지 컬럼은 인지하지 못하기 때문이다.
따라서 정확히 FOOD_TYPE과 MAX(FAVORITES)를 고른 후에 일치하는 행을 통째로 가져와야 한다.
정답 코드
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
FOOD_TYPE 별로 좋아요 수가 최대인 행을 뽑으려면 가령 'WHERE FOOD_TYPE = '한식' AND MAX(FAVORITES)' 이런 식으로 짤 수 있다. 하지만 이런 코드는 굉장히 비효율적이다. FOOD_TYPE이 100가지면 코드를 100번 반복해야 하고, FOOD_TYPE이 변경되면 다시 찾아서 수정해야 한다. 따라서 아래와 같이 SUBQUERY로 FOOD_TYPE 별 최대 좋아요 수를 뽑고, 그 행을 기준으로 전체 테이블에서 필터링하는 것이 더 효과적이다.

'Coding Test' 카테고리의 다른 글
| [SQL] 재구매가 일어난 상품과 회원 리스트 구하기 (0) | 2025.09.26 |
|---|---|
| [python] 옹알이 (1) (0) | 2025.09.23 |
| [python] 잘라서 배열로 저장하기 (0) | 2025.09.18 |
| [SQL] 자동차 대여 기록 별 대여 금액 구하기 (0) | 2025.09.18 |
| [SQL] 특정 기간 대여 가능한 자동차들의 대여비용 구하기 (0) | 2025.09.17 |