解题思路

两种方法:

  1. MySQL 在 8.0 版本以下,使用通常方法解题。
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,完成。
  1. 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;