Problem Solving/프로그래머스

[MySQL] 프로그래머스 131123. 즐겨찾기가 가장 많은 식당 정보 출력하기

LeeJaeJun 2024. 3. 1. 12:07
728x90
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/131123

 

프로그래머스

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

programmers.co.kr

정답 코드
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;
WITH RankedRestaurants AS (
  SELECT *,RANK() OVER(PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS Rest_Rank
  FROM REST_INFO
)

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM RankedRestaurants WHERE Rest_Rank = 1
ORDER BY FOOD_TYPE DESC;
SELECT T2.FOOD_TYPE, T2.REST_ID, T2.REST_NAME, T2.FAVORITES
FROM (SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
      FROM REST_INFO
      GROUP BY FOOD_TYPE) AS T1
JOIN REST_INFO AS T2 ON 
      T1.FOOD_TYPE = T2.FOOD_TYPE AND T1.FAVORITES = T2.FAVORITES
ORDER BY FOOD_TYPE DESC;

 

RANK 함수

  • 지정된 정렬 순서에 따라 순위를 매깁니다.
  • 동일한 값을 가진 행들에 대해 동일한 순위를 부여하고, 이어지는 순위에서는 건너뛴 순위를 반영합니다.

 

PARTITION BY 구문

  • 윈도우 함수의 연산을 특정 범위의 행들로 제한하는 데 사용합니다.
  • 같은 파티션 내의 행들에 대해서만 함수가 적용되고, 각 파티션은 독립적으로 계산됩니다.
SELECT 
    DepartmentID, 
    EmployeeID, 
    Salary,
    RANK() OVER(PARTITION BY DepartmentID ORDER BY Salary DESC) AS SalaryRank
FROM 
    Employees;
#  Employees 테이블의 각 행에 대해, 해당 행이 속한 부서(DepartmentID) 내에서 급여(Salary) 순위를 계산
SELECT 
    SaleDate, 
    SaleAmount,
    SUM(SaleAmount) OVER(PARTITION BY SaleDate ORDER BY SaleDate) AS CumulativeSale
FROM 
    Sales;
# 각 판매 날짜(SaleDate)에 대해 해당 날짜까지의 누적 판매액(CumulativeSale)을 계산
SELECT 
    ProductID, 
    SaleDate, 
    SaleAmount,
    AVG(SaleAmount) OVER(PARTITION BY ProductID ORDER BY SaleDate ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS MovingAvgSale
FROM 
    Sales;
#  각 상품(ProductID)에 대해, 해당 판매 날짜(SaleDate)를 포함한 최근 3일간의 평균 판매량(MovingAvgSale)을 계산
728x90
반응형