此题可以不用窗口函数来解,关键在于使用COUNT来为不同排名的salary赋予排名号(用不用DISTINCT看题目要求
有两种方法。
方法一:构建两个salaries表互相联结,此步目的是得到每个员工工资的排名号,再与外面的salaries表联结,得出题解

SELECT a.emp_no, a.salary, b.r
FROM salaries a JOIN (SELECT s1.emp_no, COUNT(DISTINCT s2.salary) r
                        FROM salaries s1, salaries s2
                        WHERE s1.salary<=s2.salary
                        GROUP BY s1.emp_no ) b //这里用GROUP BY是因为想让员工编号和他们的排名号一一对应
                   ON a.emp_no=b.emp_no
ORDER BY a.salary DESC, a.emp_no

员工10001的工资,大于等于他的工资有一个(注意是工资数字,而非具体到人),DISTINCT后为1个,所以排名号为1
10002的工资,大于等于他的工资有3个,DISTINCT后为2个,所以排名号为2
以此类推

方法二:先查询一个员工编号,再使用关联子查询得出其对应的排名号,进而输出到外部查询得到结果

SELECT s1.emp_no, s1.salary, (SELECT COUNT(DISTINCT s2.salary)
                             FROM salaries s2
                             WHERE s1.salary <= s2.salary)
FROM salaries s1
ORDER BY s1.salary DESC, s1.emp_no