https://school.programmers.co.kr/learn/courses/30/lessons/131123
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
식당의 정보를 담은 REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성하라.
단, 음식 종류를 기준으로 내림차순 정렬하라.
코드 & 풀이
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
HAVING MAX(FAVORITES) = FAVORITES
ORDER BY 1 DESC;
내가 처음 작성한 코드이다.
FOOD_TYPE으로 그룹화를 한 후, 해당 그룹 내 즐겨찾기 수가 가장 큰 그룹과 같은 값을 가지는 즐겨찾기 수만 가져오도록 한다.
하지만 결과를 보면 FOOD_TYPE이 '일식'인 행이 빠져있는 것을 알 수 있다.
이유는 GROUP BY를 통해 그룹화를 하면 보통 첫 행이 선택되는데, 일식의 경우 첫 행의 FAVORITES은 112이고, MAX(FAVORITES)은 230이기 때문에 올바른 정보가 없어 출력되지 않는다.
나머지 FOOD_TYPE의 경우, 운이 좋게 첫 행의 FAVORITES와 MAX(FAVORITES)이 일치하기 때문에 출력되는 것으로 보인다.
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으로 그룹화한 후, 첫 행을 출력하고 FAVORITES만 MAX 값을 출력하도록 한다.
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 1 DESC;
따라서, 서브쿼리를 이용해서 각 음식 종류별 최대 즐겨찾기수를 가진 식당을 찾는다.
서브쿼리에서 FOOD_TYPE별 MAX(FAVORITES)을 찾아주고 WHERE 조건절에서 다중 연산자인 IN을 활용해 필터링 해주면 된다
'SQL > Coding Test' 카테고리의 다른 글
[프로그래머스] 그룹별 조건에 맞는 식당 목록 출력하기 (0) | 2024.03.28 |
---|---|
[프로그래머스] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2024.03.28 |
[프로그래머스] 조건에 맞는 개발자 찾기 (0) | 2024.03.20 |
[프로그래머스] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2024.03.20 |
[프로그래머스] 가격대 별 상품 개수 구하기 (0) | 2024.03.19 |