题目描述

有一个薪水表 salaries 简况如下:

对所有员工的薪水 salary 按照 1-N 的排名排序 - 图1

对所有员工的薪水 salary 按照 1-N 的排名排序,相同的 salary 并列且按照 emp_no 升序排列,上述示例的查询结果如下:

对所有员工的薪水 salary 按照 1-N 的排名排序 - 图2

答案解析

本题考查了 SQL 函数中,排名窗口函数的用法,有三种可以用于排名的专用窗口函数:

  1. RANK()

在计算排名时,若存在相同的位次,会跳过之后的位次
例如,有三条排在第一位,排名时:1,1,1,4…

  1. DENSE_RANK()

在计算排名时,若存在相同位次,不会跳过之后的位次
例如,有三条排在第一位,排名时:1,1,1,2…

  1. ROW_NUMBER()

该函数赋予唯一的连续位次。
例如有三条排在第一位,排名时:1,2,3,4…
_
关于窗口函数的使用,语法格式为:

  1. -- 其中[]中的内容为可选项
  2. <窗口函数> OVER ([PARTITION BY <列清单>] ORDER BY <排序用列清单>)

本题中,使用的是第二种排名窗口函数,SQL 语句如下:

  1. SELECT emp_no,salary,DENSE_RANK () OVER (ORDER BY salary DESC) AS `rank`
  2. FROM salaries
  3. ORDER BY `rank` ASC,emp_no ASC;