题目描述
有一个薪水表 salaries 简况如下:
对所有员工的薪水 salary 按照 1-N 的排名排序,相同的 salary 并列且按照 emp_no 升序排列,上述示例的查询结果如下:
答案解析
本题考查了 SQL 函数中,排名窗口函数的用法,有三种可以用于排名的专用窗口函数:
- RANK()
在计算排名时,若存在相同的位次,会跳过之后的位次
例如,有三条排在第一位,排名时:1,1,1,4…
- DENSE_RANK()
在计算排名时,若存在相同位次,不会跳过之后的位次
例如,有三条排在第一位,排名时:1,1,1,2…
- ROW_NUMBER()
该函数赋予唯一的连续位次。
例如有三条排在第一位,排名时:1,2,3,4…
_
关于窗口函数的使用,语法格式为:
-- 其中[]中的内容为可选项
<窗口函数> OVER ([PARTITION BY <列清单>] ORDER BY <排序用列清单>)
本题中,使用的是第二种排名窗口函数,SQL 语句如下:
SELECT emp_no,salary,DENSE_RANK () OVER (ORDER BY salary DESC) AS `rank`
FROM salaries
ORDER BY `rank` ASC,emp_no ASC;