1. 题目
- 题目来源:SQL23 对所有员工的薪水按照salary降序进行1-N的排名
- 题目描述
对所有员工的薪水按照salary降序进行1-N的排名,要求相同salary并列,且按照emp_no升序排列: - 表格
- 所需结果
2. 题解
使用排序窗口函数即可:
SELECT t.emp_no, t.salary, t.t_rank
FROM (SELECT *,
DENSE_RANK() OVER(ORDER BY salary DESC) t_rank
FROM salaries) t
ORDER BY t.t_rank ASC, t.emp_no ASC
习惯了用子查询,这里其实不用这么麻烦,直接在SELECT 窗口函数即可。
SELECT emp_no,
salary,
DENSE_RANK() OVER(ORDER BY salary DESC) t_rank
FROM salaries
ORDER BY t_rank ASC, emp_no ASC
反思:SQL执行顺序、排序窗口反思小结
一、SQL中执行顺序可能引发的问题
牢记:SELECT
中的字段不可再拿去用于 WHERE
中当做条件判断,
若需要用到SELECT
中字段,需要先将其置于子查询当中(比如需要使用 排序窗口函数 作为外变判断条件的时候)
二、窗口函数
1、窗口函数组内排序的三种方法:
- ①
RANK()
,对应1, 2, 2, 4
- ②
ROW_NUMBER()
,对应1, 2, 3, 4
- ③
DENSE_RANK
,对应1, 2, 2, 3
2、排序的两种方法:
- ① 全局排序:
ORDER BY
- ② 分组排序:
ORDER BY
置于OVER()函数
中
更具体的窗口函数用法可以点击:核心内容-聚合函数
易错点:这题 ORDER BY
需要加上 DESC
进行倒序排列