Dev Hyeri

◖코딩 테스트◗▬▬▬▬▬▬▬▬▬/프로그래머스

[SQL KIT] (2024) 즐겨찾기가 가장 많은 식당 정보 출력하기(설명/코드/정답)

_hyeri 2024. 1. 21. 13:34

 

 

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/131123

 

코드1. 서브쿼리 + 조인 사용

SELECT R1.FOOD_TYPE, R1.REST_ID, R1.REST_NAME, R1.FAVORITES
FROM REST_INFO R1
JOIN (
    SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
    FROM REST_INFO
    GROUP BY FOOD_TYPE
) R2 ON R1.FOOD_TYPE = R2.FOOD_TYPE AND R1.FAVORITES = R2.FAVORITES
ORDER BY R1.FOOD_TYPE DESC;

 

코드2. 윈도우 함수 사용

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM (
    SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES,
           ROW_NUMBER() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS TYPE_FAV_RANK
    FROM REST_INFO
) INLINE_VIEW
WHERE TYPE_FAV_RANK = 1
ORDER BY FOOD_TYPE DESC;

 

내부 동작 순서 

 

1. 서브쿼리(인라인뷰) 절

REST_INFO 테이블에서  FOOD_TYPE, REST_ID, REST_NAME, FAVORITES,
ROW_NUMBER() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS TYPE_FAV_RANK를 뷰로 만든다.

(ROW_NUMBER() 함수는 PARTITION BY를 이용하여 FOOD_TYPE 별로 FAVORITES 수 에 대한 내림차순 순위를 할당하며, 컬럼 이름은  TYPE_FAV_RANK로 한다.)

FOOD_TYPE REST_ID REST_NAME FAVORITES TYPE_FAV_RANK
분식 00008 애플우스 151 1
분식 00019 에버그린 130 2
분식 00018 가나안 51 3
분식 00025 별미진 10 4
양식 00003 따띠따띠뜨 102 1
양식 00007 소마바이 65 2
양식 00006 지아스나폴리 50 3
일식 00004 스시사카우스 230 1
일식 00005 코슌스 123 2
일식 00002 하이가쯔네 112 3
일식 00023 싹쓰리 42 4
중식 00015 만정 20 1
한식 00001 은돼지식당 734 1
한식 00020 신동태 550 2
한식 00010 맷돌우리콩감자탕 243 3
한식 00016 오대산산채전문점 230 4
한식 00021 강수곱창 210 5
한식 00011 부암갈비 150 6
한식 00009 숙성돼지 143 7
한식 00022 군자네 101 8
한식 00017 방화동쭈꾸미마을 80 9
한식 00014 동명항생선숯불구이 53 10
한식 00024 농실가찹쌀순대 12 11
한식 00012 만다복 10 12
한식 00013 은성보쌈 10 13

 

2. WHERE 절

TYPE_FAV_RANK 순위가 1인 행만 선택 

 

3. ORDER BY 절

최종 결과를 FOOD_TYPE를 기준으로 내림차순으로 정렬

 


 

초기 코드

 

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
HAVING MAX(FAVORITES)
ORDER BY FOOD_TYPE

 

FOOD_TYPE REST_ID REST_NAME FAVORITES
분식 00008 애플우스 151
양식 00003 따띠따띠뜨 102
일식 00002 하이가쯔네 112
중식 00015 만정 20
한식 00001 은돼지식당 734

 

=>오류

'일식/ 00004 /스시사카우스/230'  출력되어야 함

 

오류 원인

1. HAVING 절 이해 부족

--> 집계 함수를 기반으로 조건을 걸 때 사용. MAX(FAVORITES)가 어떤 조건과 함께 사용되어야 함

2. JOIN의 ON 이해 부족 

--> ON은 여러 컬럼으로 붙일 수 있다.

2. 윈도우 함수 학습 필요

https://developevolvify.tistory.com/180