https://school.programmers.co.kr/learn/courses/30/lessons/131123
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[1차 코드]
음식 종류별로 가장 즐겨찾기가 많은 식당을 찾기 위해 음식 종류로 GROUP BY 후, favorites column에 대해 MAX 함수를 사용했다.
SELECT food_type, rest_id, rest_name, MAX(favorites) AS favorites
FROM rest_info
GROUP BY food_type
ORDER BY food_type DESC
이렇게 코드를 작성하는 경우 왜 틀릴까? 를 찾아보니 MAX(favorite) 열은 각 food type 별로 최대 즐겨찾기 건수를 가져오지만, 이 즐겨찾기 건수가 위 출력 결과의 rest_name의 즐겨찾기 건수가 아닐 수 있게 된다고 한다.
food_type으로 GROUP BY 한 후에 가져온 rest_id, rest_name은 MAX(favorite)에 대응하는 값이 아니라, 그냥 특정 food type의 맨 첫번째 row인 것이다.
이러한 문제를 해결하기 위해서는 WHERE 절 서브쿼리를 사용해야 한다.
왜냐하면 특정 조건을 만족하는 (이 문제에서는 음식 종류별 '최다 즐겨찾기' 라는 조건) column을 뽑아야 하기 때문이다.
쿼리문에서 사용할 조건을 만들어주기 위해, 우선 food_type 별로 최다 즐겨찾기 수를 뽑아보았다.
SELECT food_type,
MAX(favorites) AS 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) AS favorites
FROM rest_info
GROUP BY food_type)
이때 결과는 음식 종류를 기준으로 내림차순 정렬해달라고 하니, 마지막에 ORDER BY를 붙여주자.
[정답 코드]
SELECT food_type, rest_id, rest_name, favorites
FROM rest_info
WHERE (food_type, favorites) IN (
SELECT food_type,
MAX(favorites) AS favorites
FROM rest_info
GROUP BY food_type)
ORDER BY food_type DESC
[배운점]
그룹별로 어떤 조건을 만족하는 데이터를 뽑고싶을 때 -->
1. 그룹 + 조건을 뽑아 WHERE 절 서브쿼리로 사용하고
2. IN, NOT IN을 사용하여 조건을 만족하는 데이터만 뽑는다
'SQL > 문제풀이' 카테고리의 다른 글
[프로그래머스] 입양 시각 구하기 (1) (0) | 2023.12.26 |
---|---|
[프로그래머스] 가격대별 상품 개수 구하기 (0) | 2023.12.26 |
[프로그래머스] 상위 n개 레코드 (0) | 2023.12.22 |
[프로그래머스] 어린 동물 찾기 (0) | 2023.12.22 |
[프로그래머스] 오프라인/온라인 판매 데이터 통합하기 (0) | 2023.12.22 |