(较难)SQL练习23:对所有员工的当前薪水按照salary进行按照1-N的排名

SQL练习23:对所有员工的当前薪水按照salary进行按照1-N的排名

题目描述

有一个薪水表 salaries 简况如下:
在这里插入图片描述
对所有员工的薪水按照 salary 降序进行 1-N 的排名,要求相同 salary 并列且按照 emp_no 升序排列:
在这里插入图片描述


考察知识点

窗口函数 DENSE_RANK()ORDER BY


解题思路

根据题目的要求,可以使用窗口函数进行排序。

SELECT emp_no, salary, DENSE_RANK() OVER(ORDER BY salary DESC)
FROM salaries

三种排序的窗口函数:

  • RANK()
    在排序时,若有相同位次,会跳过这些位次进行排序。
    例如,有3条数据排在第1位时,排序为:1,1,1,4······
  • DENSE_RANK()
    在计排序时,若存在相同位次,不会跳过之后的位次。
    例如,有3条数据排在第1位时,排序为:1,1,1,2······
  • ROW_NUMBER()
    这个函数赋予唯一的连续位次。
    例如,有3条数据排在第1位时,排序为:1,2,3,4······

题目来源:牛客网-SQL数据库实战题

每日打卡,❤ 点个赞再走吧!!!❤

在这里插入图片描述
后续会继续分享 Mysql 方面的文章,如果感兴趣的话可以点个关注不迷路哦~。

### SQL实现员工薪水降序排名 对于在SQL中对员工薪水按降序进行1-N排名的需求,可以采用窗口函数`ROW_NUMBER()`来完成这一操作。此方法不仅能够满足按照薪水降序排列的要求,还能处理当薪水相同时依据`emp_no`升序排列的情况。 ```sql SELECT emp_no, salary, ROW_NUMBER() OVER (ORDER BY salary DESC, emp_no ASC) AS rank FROM salaries; ``` 上述查询语句通过使用`ROW_NUMBER()`窗口函数,在`OVER`子句内指定排序规则——先基于`salaray`字段做降序排列(`DESC`),再根据`emp_no`字段做升序排列(`ASC`),从而实现了预期的功能[^1]。 为了进一步优化并确保结果集中的每条记录都关联到其对应的最高薪资出现次数(即有多少人的工资高于当前员工),可引入额外的逻辑计算: ```sql WITH RankedSalaries AS ( SELECT s.emp_no, s.salary, ROW_NUMBER() OVER (ORDER BY s.salary DESC, s.emp_no ASC) AS rnk FROM salaries s ), HigherSalaryCounts AS ( SELECT rs.emp_no, COUNT(*) AS higher_salary_count FROM RankedSalaries rs JOIN RankedSalaries rs2 ON rs.rnk > rs2.rnk AND rs.emp_no != rs2.emp_no GROUP BY rs.emp_no ) SELECT rs.emp_no, rs.salary, rs.rnk, COALESCE(hsc.higher_salary_count, 0) AS higher_salaries_than_me FROM RankedSalaries rs LEFT JOIN HigherSalaryCounts hsc ON rs.emp_no = hsc.emp_no ORDER BY rs.salary DESC, rs.emp_no ASC; ``` 这段复杂度稍高的代码片段首先创建了一个名为`RankedSalaries`的CTE(Common Table Expression),用于存储初步排名后的数据;接着定义了另一个CTE `HigherSalaryCounts` 来统计每位员工拥有更高薪资的人数;最后将两者联结起来展示最终的结果列表[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream丶Killer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值