首页 > 试题广场 >

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

[编程题]对所有员工的薪水按照salary降序进行1-N的排名
  • 热度指数:351115 时间限制: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) 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)
 select emp_no
,salary
,dense_rank()over(order by salary desc) t_rank
from salaries
group by 1,2
这样有问题吗?
发表于 2024-05-16 20:17:01 回复(0)
select emp_no,salary,dense_rank() over(order by salary desc) as t_rank
from salaries
order by t_rank,emp_no
发表于 2024-03-21 17:18:09 回复(1)
我在想,emp_no在排序前已经按照升序排列好了,那么用窗口排列后,相同的salary里的emp_no是不是已经是升序排列了呢,那这样子解是不是也可以
select
    emp_no,
    salary,
    dense_rank() over(order by salary desc) t_rank
from
    salaries
where 
    to_date = '9999-01-01'
如果要加排序的话,那就是
select
    emp_no,
    salary,
    dense_rank() over(order by salary desc) t_rank
from
    salaries
where 
    to_date = '9999-01-01'
order by
    t_rank,emp_no


编辑于 2024-01-10 15:33:29 回复(0)
select emp_no,salary,dense_rank()over(order by salary desc) as t_rank from salaries order by t_rank,emp_no asc
编辑于 2024-01-09 19:54:30 回复(0)
set @num := 0;
set @salTmp := 0;
select tt.emp_no,tt.salary,tt.t_rank from (select *,case when @num = 0 then (@num :=@num+1) and @salTmp :=salary
              when @salTmp<>salary then (@num :=@num+1)  and @salTmp :=salary
              when @salTmp=salary then (@num :=@num)
end as num,@salTmp,@num as t_rank
 from (SELECT emp_no,salary FROM salaries
group by salary,emp_no
order by salary desc,emp_no asc) t) tt;
发表于 2023-11-16 11:23:17 回复(0)
 select emp_no,salary,dense_rank()over(order by salary desc) t_rank
    from salaries
    order by salary desc,emp_no
发表于 2023-10-31 15:44:34 回复(0)
select emp_no,salary,dense_rank()over(order by salary desc) as t_rank
from salaries
order by salary desc,emp_no


发表于 2023-10-15 09:38:41 回复(0)
第一步:使用自定义变量实现序号,先对薪资去重排序,得到薪资和其序号,此结果作为一个数据表使用。
第二步:直接在salaries表中查询员工编号和薪资,按题目要求排序。第三个字段,使用第一步的结果进行搜索
select 
    sals.emp_no,
    sals.salary,
    (select t_rank 
       from (select 
                sal.salary as salary, 
                cast((@rownum := @rownum + 1) as unsigned) as t_rank 
             from 
                (select salary 
                   from salaries 
                  where to_date = '9999-01-01' 
                  group by salary) as sal, 
                (SELECT @rownum := 0) as rn 
             order by sal.salary desc) as sall 
      where sals.salary = sall.salary)
from salaries as sals
where sals.to_date = "9999-01-01"
order by sals.salary desc,sals.emp_no;



发表于 2023-09-19 23:59:03 回复(0)
# 对所有员工的薪水按照salary降序先进行1-N的排名,如果salary相同,再按照emp_no升序排列:

# 注意:并列排名写法 dense_rank()over()

with dwd_data as (
select 
emp_no,
salary,
dense_rank()over( order by salary desc ) as t_rank
from salaries
) 

select 
  emp_no,
  salary,
  t_rank
 from dwd_data order by 3,1
 ;

发表于 2023-09-08 11:05:57 回复(0)
select emp_no,salary,dense_rank()over(order by salary desc)
from salaries
order by salary desc,emp_no

发表于 2023-08-16 10:26:37 回复(0)