배경

  • 어떤 테이블에 대해서 컬럼 A 기준으로 group을 만들고 그룹 내에서 컬럼 B 기준으로 상위 n개를 가져와야 되는 목적이 생겼다.

해결 방법

  • 예시를 들어 설명을 한다.

  • 아래와 같이 테이블과 행이 존재한다.

create table player  
(  
    user_id bigint auto_increment primary key,
    team_id bigint not null,  
    score   bigint not null  
);

  • 다음과 같이 데이터가 존재하고, team_id 별로 상위 2등까지 플레이어를 확인하고 싶다면 아래와 같이 작성하면된다.
SELECT * FROM(  
    SELECT *, RANK() OVER (PARTITION BY player.team_id ORDER BY player.score DESC) as ranking  
    FROM player  
 ) as player_ranking  
where player_ranking.ranking < 3;

참고 자료