解题思路
两种方法:
- MySQL 在 8.0 版本以下,使用通常方法解题。
- 首先我们不考虑 [1, 2, 2, 3] 这样并列时不跳数字的排列方式,而是考虑 [1, 2, 2, 4] 这种有并列时会跳数字的排列方式。这种情况下解题思路与《获取当前薪水第二多的员工的emp_no以及其对应的薪水salary》 以及《查找入职员工时间排名倒数第三的员工所有信息》 一致。可以用两个 salaries 表做笛卡尔积,COUNT() 函数计算比自己工资高的人数,如果自己的工资是最高的,即没有人比自己工资高,那么计算后结果为 0。如果自己是第二高,那么结果为 1。最后在结果上 + 1,就是上面所说的会跳数字方式。那么此时的代码实现是
SELECT s1.emp_no, s1.salary, ( SELECT COUNT(s2.salary) + 1 FROM salaries s2 WHERE s2.salary > s1.salary ) AS t_rank FROM salaries s1 ORDER BY s1.salary DESC, s1.emp_no;
- 然后我们再在上面的基础上,考虑不跳数字的方式,其实很简单,在 s2 表中的 salary 字段加一个 DISTINCT,完成。
- MySQL 在 8.0 版本以上,使用开窗函数。
代码实现
方法1:
SELECT s1.emp_no, s1.salary, ( SELECT COUNT(DISTINCT s2.salary) + 1 FROM salaries s2 WHERE s2.salary > s1.salary ) AS t_rank FROM salaries s1 ORDER BY s1.salary DESC, s1.emp_no;
方法2(开窗函数):
SELECT emp_no, salary, DENSE_RANK() OVER(ORDER BY salary DESC) AS t_rank FROM salaries ORDER BY t_rank, emp_no;