首页 > 试题广场 >

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

[编程题]对所有员工的薪水按照salary降序进行1-N的排名
  • 热度指数:369347 时间限制: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
select * 
from(
    select emp_no,salary,
    dense_rank() over(order by salary desc) as t_rank
    from salaries
)as t
order by t.t_rank,t.emp_no
先用窗口函数给薪资排序,再在外层嵌套一层select,按照薪资序号t_rank、员工编号emp_no排序
发表于 2026-01-17 23:11:23 回复(0)
select emp_no,salary,dense_rank() over(order by salary desc) as t_rank
from salaries
order by salary desc,emp_no asc
这样写有什么问题嘛,我咋看不懂为啥要限制日期,还有一些其他的,看蒙了
发表于 2025-11-09 21:50:09 回复(0)
select 
emp_no
,salary
,dense_rank() over(order by salary desc) as t_rank
from salaries 
order by 2 desc,1

发表于 2025-10-15 11:50:25 回复(0)
方法一:
select
    s1.emp_no,
    s1.salary,
    count(distinct s2.salary) as ranking
from
    salaries as s1
    inner join salaries as s2
where
    s1.salary <= s2.salary
group by
    s1.salary,s1.emp_no
order by
    s1.salary DESC,
    s1.emp_no ASC;
方法二:
SELECT
    emp_no,
    salary,
    CAST(`Rank` AS UNSIGNED) AS `Rank` --将排名转换为无符号整数(去除小数)
FROM
    (SELECT
        emp_no,
        salary,
        @rank := @rank + (@pre <> (@pre := salary)) `Rank` 
        --计算排名(1或0的累加,结果为整数)
    FROM
        salaries,
    (SELECT
            @rank := 0,
            @pre := -1) INIT --初始化变量为整数类型
    WHERE
        to_date = '9999-01-01' --筛选当前有效薪资
    ORDER BY
        salary DESC --按薪资降序排***保最高薪资排名为1)
    ) AS ranked;
发表于 2025-09-24 17:09:31 回复(0)
select emp_no,
salary,
dense_rank() over(
order by salary desc
) as t_rank
from salaries
发表于 2025-08-13 14:27:01 回复(0)
select emp_no,salary,
dense_rank()over(order by salary desc) t_rank
from salaries
order by t_rank,emp_no
发表于 2025-08-05 14:39:05 回复(0)
with t1 as(
    select emp_no, salary, dense_rank()over(order by salary desc) t_rank
    from salaries)
select  emp_no, salary, t_rank from t1
order by t_rank, emp_no

发表于 2025-07-31 17:42:01 回复(0)
select
   emp_no
   ,salary
   ,row_number() over (order by salary desc,emp_no asc) as t_rank
from salaries
order by t_rank;
发表于 2025-06-24 17:05:47 回复(0)
评论区有的代码考虑的很全面,我这解法估计只是答案对了,应该哪里缺少了
select
    emp_no,salary,
    dense_rank()over(order by salary desc) as t_rank
from
    salaries
order by 
    salary desc,emp_no asc


发表于 2025-06-04 19:52:13 回复(0)
select emp_no,salary,
dense_rank() over(order by salary desc) as t_rank
from salaries
order by t_rank,emp_no

发表于 2025-05-09 19:48:41 回复(0)
with k as
(select
    emp_no,
    salary,
    DENSE_RANK() over (
        order by
            salary desc
    ) t_rank
from
    salaries)
select emp_no,salary,t_rank from k

发表于 2025-04-01 15:37:23 回复(0)
select *
from
(select emp_no ,salary ,dense_rank()over(order by salary desc) t_rank
from salaries) rk
order by t_rank ,salary desc
窗口函数加子查询
发表于 2024-12-27 18:50:52 回复(1)
select emp_no
    , salary
    , dense_rank() over(order by salary desc) as t_rank
from salaries
order by t_rank,emp_no

发表于 2024-09-16 14:48:35 回复(0)
select emp_no ,salary,
DENSE_RANK() OVER (ORDER BY salary desc) AS t_rank
from salaries
order by salary desc, emp_no
发表于 2024-09-11 14:56:02 回复(0)
难道我们做的不是同一道题?这么写不就行?

select
emp_no,salary
,dense_rank()over(order by salary desc ) as t_rank
from salaries
order by t_rank,emp_no
发表于 2024-08-26 19:19:50 回复(0)
select emp_no,salary
,dense_rank() over(order by salary desc) t_rank
from salaries
where to_date='9999-01-01'
order by salary desc,emp_no
发表于 2024-08-21 19:00:31 回复(0)
select emp_no
      ,salary
      ,dense_rank() over (order by salary desc  ) t_rank
from salaries
order by t_rank,emp_no

发表于 2024-07-21 20:37:54 回复(0)
select 
emp_no
,salary
,dense_rank()over(order by salary desc) as t_rank
from salaries
order by salary desc,emp_no
【用dense rank 函数 ---并列连续排名1 1 2 3】

发表于 2024-07-09 18:46:48 回复(0)
select
    emp_no,
    salary,
    dense_rank() over (order by salary desc) as t_rank
from
    salaries
order by
    t_rank,
    emp_no

发表于 2024-05-24 23:40:45 回复(0)