首页 > 试题广场 >

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

[编程题]对所有员工的薪水按照salary降序进行1-N的排名
  • 热度指数:344817 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个薪水表salaries简况如下:
emp_no
salary
from_date
to_date
10001
88958 2002-06-22
9999-01-01
10002 72527 2001-08-02
9999-01-01
10003
43311 2001-12-01
9999-01-01
10004 72527 2001-12-01 9999-01-01


对所有员工的薪水按照salary降序先进行1-N的排名,如果salary相同,再按照emp_no升序排列:
emp_no salary t_rank
10001 88958 1
10002
72527 2
10004
72527
2
10003
43311 3

示例1

输入

drop table if exists  `salaries` ; 
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10003,43311,'2001-12-01','9999-01-01');
INSERT INTO salaries VALUES(10004,72527,'2001-12-01','9999-01-01');

输出

10001|88958|1
10002|72527|2
10004|72527|2
10003|43311|3
头像 牛客985786820号
发表于 2020-05-11 22:14:35
这道题目考察的是SQL窗口函数(OLAP函数)中用于排序的专用窗口函数用法 但是由于关系数据库提供支持OLAP用途功能时间不长 还有一部分DBMS不支持这个新功能(比如MYSQL) select emp_no, salary, &nb 展开全文
头像 horsemuzi
发表于 2020-10-11 18:31:51
不使用窗口函数 -- rank排名:查询表中大于自己薪水的员工的数量(考虑并列:去重) SELECT s1.emp_no, s1.salary, (SELECT COUNT(DISTINCT s2.salary) FROM salaries s2 WHER 展开全文
头像 N刻后告诉你
发表于 2020-05-19 20:35:31
题目:对所有员工的当前(to_date=‘9999-01-01')薪水按照salary进行按照1-N的排名,相同的salary并列且按照emp_no升序排列 错误示范:虽然在题库中能通过,但是在mysql中无法通过,因为s1.salary不是可聚合项SELECT s1.emp_no, s1.sala 展开全文
头像 此用户名涉嫌违规
发表于 2021-03-24 14:23:40
题目描述:对所有员工的薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列。这题重点技巧如何找出【1,2,2,3】这种不跳数字的排序1.自联结: select t1.emp_no, t1.salary, count( distinct t2.salary) as 展开全文
头像 数据分析阿宇君
发表于 2020-08-21 17:08:18
select emp_no,salary, dense_rank() over(order by salary desc) as rank from salaries where to_date='9999-01-01' order by rank,emp_no asc窗口函数:htt 展开全文
头像 牛客355849203号
发表于 2021-01-12 15:42:58
实现dense_rank()和rank() 在于加粗部分是否去重select emp_no,salary,(select count(distinct salary ) from salaries s2 where s1.salary<=s2.salary and to_date='9999- 展开全文
头像 馒头2020
发表于 2021-02-14 16:44:45
解题思路 两种方法: MySQL 在 8.0 版本以下,使用通常方法解题。 首先我们不考虑 [1, 2, 2, 3] 这样并列时不跳数字的排列方式,而是考虑 [1, 2, 2, 4] 这种有并列时会跳数字的排列方式。这种情况下解题思路与《获取当前薪水第二多的员工的emp_no以及其对应的薪水s 展开全文
头像 高质量搬砖人
发表于 2021-01-30 10:02:32
方法)dense_rank()over SELECT emp_no, salary, dense_rank()over(ORDER BY salary DESC) FROM salaries WHERE to_date = '9999-01-01'为何用dense_rank : 相同分数并列且不影响 展开全文
头像 GangDong
发表于 2021-04-16 15:34:29
自连接查询,与前面的题目一样的思路 SELECT s1.emp_no, s1.salary, COUNT(DISTINCT s2.salary) AS t_rank FROM salaries s1 inner join salaries s2 on s2.s 展开全文
头像 牛客422927037号
发表于 2021-11-01 16:45:44
原因:由于MySQL版本8.0以下不支持窗口函数,所以考虑用用户变量来存储排名 思路:①定义 currentRank 变量存储当前排名,previouRankSalary 存储上一个排名的薪水,用于判断是否是相同薪水,如果相同则排名不变,如果不同则 currentRank + 1 SE 展开全文