728x90
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/131123
내 풀이
풀이 1
WITH w1 AS (
SELECT REST_ID
, RANK() OVER(PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS ranking
FROM REST_INFO
)
SELECT i.FOOD_TYPE, i.REST_ID, i.REST_NAME, i.FAVORITES
FROM REST_INFO i INNER JOIN w1
ON i.REST_ID = w1.REST_ID
WHERE w1.ranking = 1
ORDER BY i.FOOD_TYPE DESC;
RANK 함수(윈도우 함수)와 CTE를 사용한 풀이이다.
풀이 2
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;
WHERE 절에 서브쿼리를 사용한 풀이이다.
처음에는 서브쿼리를 아래와 같이 사용했는데, 이는 정확한 값이 도출되지 않는다.
# 틀린 풀이
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (REST_ID, FAVORITES) IN (
SELECT REST_ID, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC;
왜냐하면 WHERE 절에서 FOOD_TYPE을 통해 GROUP BY를 하였지만,
SELECT로는 food_type을 뽑아내지 않기 때문이다.
이는 각 food_type 별로 여러 rest_id가 있을 수 있으므로,
rest_id를 그룹화된 열에 포함시키면 논리적으로 맞지 않는다.
GROUP BY와 SELECT의 조합을 항상 유의하고 사용해야겠다.
728x90
'코딩테스트 > SQL' 카테고리의 다른 글
[프로그래머스][MySQL] Lv. 2 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 (0) | 2024.08.05 |
---|---|
[프로그래머스][MySQL] Lv. 3 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2024.08.05 |
[프로그래머스][MySQL] Lv. 4 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2024.07.29 |
[프로그래머스][MySQL] Lv. 3 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2024.07.25 |
[프로그래머스][MySQL] Lv. 4 그룹별 조건에 맞는 식당 목록 출력하기 (0) | 2024.07.19 |