* Computer Science/database

leetcode 문제에서 rank 함수 사용하기

soicem 2020. 6. 23. 19:58

Project Employees 3 문제를 풀며 group by로 묶어서 Limit를 걸기가 애매한 경우가 발생했다.  이때 사용하는 함수가 rank 함수다.

# Write your MySQL query statement below
select a.project_id, a.employee_id
    from (select 
        p.project_id,
        e.employee_id,
        rank() over(partition by p.project_id order by e.experience_years desc) rankk
        from Project p
        inner join Employee e
        on p.employee_id = e.employee_id
    ) a
    where a.rankk = 1
;

 rank() over 안에서 파티션을 나눌 컬럼명을 선택한다.  이후 정렬할 기준을 정하고 alias를 달아준다.  limit 1로 최대/최소값을 가져올 수는 있지만 해당 값이 여러개가 있을 경우 곤란해지는데 rank를 사용해서 해결할 수 있다.

 

 조금 더 들어가보자.  Project Employees3에서 순위를 매기는 방식은 중요하지 않았다.  순위의 디테일에 관계없이 id만 출력하면 되었다.  하지만 순위 자체를 출력할 경우 rank 함수를 사용할 지 dense_rank 함수를 사용할 지 고려해야 한다.

 Rank Scores 문제는 두 함수를 시도해보기 좋은 문제다.  rank 함수는 순위를 매기되, 순위에 중복이 존재하면 다음 순위에 영향을 준다. 예를 들어, 1순위가 2개가 있으면 다음 순위는 2순위가 아닌 3순위가 된다.  dense_rank는 순위에 중복이 존재하더라도 다음 순위에 영향을 주지 않는다.  예로, 1순위가 2개, 3개던 개수에 관계없이 다음 순위는 2순위가 된다.  Rank Scores의 요구사항은 dense_rank를 사용하는 것임을 쉽게 알 수 있다.

# Write your MySQL query statement below
select Score, rank() over(order by Score) `Rank` from Scores;
select Score, dense_rank() over(order by score desc) as `Rank` from Scores;

 

'* Computer Science > database' 카테고리의 다른 글

DB 용어 정리  (0) 2020.06.30
빈도로 최대/최소를 가져올 때는 LIMIT 1  (0) 2020.06.26
중간 정리  (0) 2020.06.23
스토어드 프로시저?  (0) 2020.06.21
secondary index 적용 시 analyze 명령어 사용  (0) 2020.06.21