SELECT department.name
,employee.name
,employee.salary
,RANK() OVER (PARTITION BY department.name ORDER BY Salary DESC) AS rank
FROM employee
INNER JOIN Department ON Employee.departmentId = Department.id
아래는 1차 시도의 결과인데, 오답이다.
["IT", "Janet", 69000, 5] 가 없는 결과가 나왔어야 한다.
["name", "name", "salary", "rank"],
[["IT", "Max", 90000, 1],
["IT", "Joe", 85000, 2],
["IT", "Randy", 85000, 2],
["IT", "Will", 70000, 4],
["IT", "Janet", 69000, 5],
["Sales", "Henry", 80000, 1],
["Sales", "Sam", 60000, 2]]}
틀린 이유는?
윈도우 함수 선택을 잘못했다.
RANK()가 아니라 DENSE_RANK() 로 써야함.
잠시, RANK()와 DENSE_RANK() 의 차이점은?
같은 점수가 나왔을 때 순위매기는 방식이 다름.
RANK() : 공동1위(2명), 3위, 4위(3명), 7위
DENSE_RANK() : 공동1위(2명), 2위, 3위(3명), 4위.
DENSE 의 뜻을 보면 이해가 쉬움.
더 빽빽, 촘촘, 밀도있게 순위를 줬다는 뜻!
SELECT Department
,Employee
,Salary
FROM (
SELECT department.name AS Department
,employee.name AS Employee
,employee.salary AS Salary
,DENSE_RANK() OVER (PARTITION BY department.name ORDER BY Salary DESC) AS dense_rank
FROM employee
INNER JOIN Department ON Employee.departmentId = Department.id) AS rank_table
WHERE rank_table.dense_rank <= 3