题目自寻
解题:
这个有问题,我用的row_number,但它只显示部门的前3个记录.
用的row_number,但是partion by 条件不对,答案不对。
话说row_number partion by 如果这样填,意义是什么?感觉就相当于没有进行部门里的比较。
改成rank函数
select Department,Employee,Salary from (
select d.name as Department,e.name as Employee ,e.salary as Salary,dense_rank() over (partition by d.name order by e.salary desc ) as rank_num
from Employee e left join Department d on e.departmentId = d.id
group by d.name ,e.name,e.salary order by e.salary desc)t where t.rank_num <=3
知识点:
1、rank跳次排序
RANK()
: 这个函数计算排名并且跳过相同排名的行。如果多行具有相同的排序值,则它们将具有相同的排名,并且下一个排名将会跳过相同的排名。例如,如果有两个行具有第二高的值,则下一个排名将是第四名,而不是第三名。
2、dense_rank不跳次排序(想当于并列xx名)
本题我们选用这个。
3、row_number 顺序排序
所以,它只能显示前3个记录。