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 |