[SQL] window 함수 RANK() | GROUP BY와 MAX 함께 쓰기

·2024년 11월 29일

SQL

목록 보기
1/23

window function RANK() 복습

SQL 코드카타 48번

즐겨찾기가 가장 많은 식당 정보 출력하기

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM (
    SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES,
        RANK() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) FAV_RANK
    FROM REST_INFO
    ORDER BY FOOD_TYPE DESC ) a
WHERE a.FAV_RANK = 1

GROUP BY와 MAX 잘 사용하기

  • 문제가 없는 경우:
SELECT Department, MAX(Salary)
FROM Employees
GROUP BY Department;

위 쿼리문의 경우 부서와 부서별 최고 연봉이 알맞게 출력됨.

  • 문제가 생기는 경우:
SELECT Department, EmployeeName, MAX(Salary)
FROM Employees
GROUP BY Department;

MAX()와 함께 사용하지 않은 열(EmployeeName)이 SELECT문에 포함될 때 잘못된 값이 반환될 수 있음

왜?
EmployeeName의 값을 반환하려고 하지만, 그룹화된 각 부서에서 어느 직원의 이름을 반환해야 할지 정의되지 않았기 때문에 임의값이 반환됨.

  • 해결법 1 - MAX()값과 일치하는 행만 선택하기 with JOIN
SELECT e.Department, e.EmployeeName, e.Salary
FROM Employees e
JOIN (
    SELECT Department, MAX(Salary) AS MaxSalary
    FROM Employees
    GROUP BY Department
) m ON e.Department = m.Department AND e.Salary = m.MaxSalary;
  • 해결법 2 - window 함수 RANK()를 사용하여 1위에 랭크된 행만 가져오기
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM (
    SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES,
        RANK() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) FAV_RANK
    FROM REST_INFO
    ORDER BY FOOD_TYPE DESC ) a
WHERE a.FAV_RANK = 1
profile
To Dare is To Do

0개의 댓글