본문 바로가기
Computer/Algorithm_SQL

[Algorithm_SQL] 즐겨찾기가 가장 많은 식당 정보 출력하기 (Success)

by HJ0216 2023. 10. 23.
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

🙂 확인 사항

1. REST_INFO 테이블

2. 음식종류별로 즐겨찾기수가 가장 많은

3. 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회

4. 음식 종류를 기준으로 내림차순 정렬

 

 

📝 Language: Oracle

1
2
3
4
5
6
7
8
9
10
11
12
13
  SELECT FOOD_TYPE, 
         REST_ID, 
         REST_NAME, 
         FAVORITES
    FROM REST_INFO
   WHERE (FOOD_TYPE, FAVORITES) IN (
         SELECT FOOD_TYPE, MAX(FAVORITES) FAVORITES
           FROM REST_INFO
       GROUP BY FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC
;
 
 

* 중첩 서브 쿼리

    - FOOD_TYPE과 FAVORITES를 Set로 잡아 Type 별 최대 즐겨찾기수만 Where절에 포함되도록 함

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  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 RN
          FROM REST_INFO
    )
   WHERE RN = 1
ORDER BY FOOD_TYPE DESC
;
 
 

* 인라인 뷰

    - 윈도우 함수: ROW_NUMBER

        - FOOD_TYPE별로 FAVORITES를 내림차순하여 RN 추가

 

🚨 Window 함수는

    - 개별 행마다 계산하므로 Group by보다 비효율적일 수 있음

    - Distinct의 추가 작업이 필요하므로 비효율적일 수 있음

 

1
2
3
4
5
6
7
8
9
10
11
12
13
 SELECT FOOD_TYPE, 
         REST_ID, 
         REST_NAME, 
         FAVORITES
    FROM REST_INFO r1
   WHERE FAVORITES = (
       SELECT MAX(FAVORITES)
         FROM REST_INFO r2
        WHERE r2.FOOD_TYPE = r1.FOOD_TYPE
   )
ORDER BY FOOD_TYPE DESC
;
 
 

* 중첩 서브 쿼리

    ⭐ 중첩 서브 쿼리에서 집계함수 사용 시, GROUP BY절 필수 X

        - SELECT MAX(FAVORITES) FROM REST_INFO: 전체 테이블에서 최대값 조회

        - WHERE 조건절: 메인 테이블의 FOOD_TYPE과 동일한 서브 테이블의 FOOD_TYPE 중 FAVORITES 최대값 조회

 

 

 

🔗 소스 코드
GitHub