https://school.programmers.co.kr/learn/courses/30/lessons/131123#qna
이 문제를 통해서 새롭게 알게 된 것이 있어 정리해보려고 합니다.
GROUP BY를 통해서 그룹을 만들고
그 그룹 안에서 MAX값을 뽑으려고 할 때
SELECT MAX(FAVORITES), REST_NAME
FROM REST_INFO
GROUP BY FOOD_TYPE
위와 같이 하면 그 그룹 안에 있는 가장 큰 값을 가진 식당의 이름(REST_NAME)이 나올 것이라고 예상할 수도 있습니다.
하지만 그렇지 않습니다.
FOOD_TYPE | REST_NAME | FAVORITES |
---|---|---|
한식 | 온면 | 40 |
일식 | 아쯔다무라 | 50 |
한식 | 소박 | 100 |
위와 같이 테이블이 있다면
FOOD_TYPE | REST_NAME | |
---|---|---|
한식 | 온면 | 100 |
일식 | 아쯔다무라 | 50 |
위의 결과가 나옵니다.
음식 종류에 따른 최댓값은 나오나 그 최대값을 가지는 식당의 이름이 나오는 것이 아니라
원래 테이블 상에 그룹을 만든 첫번째 식당의 이름이 나온다는 것을 기억해야 합니다.
따라서 정답은 아래와 같습니다.
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FAVORITES,FOOD_TYPE) IN (
SELECT MAX(FAVORITES), FOOD_TYPE
FROM REST_INFO
GROUP BY FOOD_TYPE
)
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC