所有员工的当前(to_date='9999-01-01')薪水按照salary进行按照1-N的排名

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

http://www.nowcoder.com/questionTerminal/b9068bfe5df74276bd015b9729eec4bf

不使用窗口函数

-- rank排名:查询表中大于自己薪水的员工的数量(考虑并列:去重)
SELECT 
  s1.emp_no,
  s1.salary,
  (SELECT 
    COUNT(DISTINCT s2.salary) 
  FROM
    salaries s2 
  WHERE s2.to_date = '9999-01-01' 
    AND s2.salary >= s1.salary) AS `rank`  -- 去重:计算并列排名
FROM
  salaries s1 
WHERE s1.to_date = '9999-01-01' 
ORDER BY s1.salary DESC,
  s1.emp_no ;

使用窗口函数

SELECT 
  emp_no,
  salary,
  dense_rank () over (
ORDER BY salary DESC) AS `rank` 
FROM
  salaries 
WHERE to_date = '9999-01-01' ;
全部评论
`rank`,这里必须要加引号吗,试了不加引号的报错了
1
送花
回复 分享
发布于 2020-11-09 20:54
SELECT COUNT(DISTINCT s2.salary) FROM salaries s2 WHERE s2.to_date = '9999-01-01' AND s2.salary >= s1.salary s2.sal>=s1.sal,看第一条数据,大于等于88958的只有它本身,所以distinct不起作用,接着count计算出只有一条数据,所以输出 1,即排第一, 看第二条数据,大于等于72527的有三条,分别是88958,72527,72527,取出进行distinct,得88958,72527,接着count计算,得2,因此输出 2,即排第二。 之后的数据依此类推。
7
送花
回复 分享
发布于 2022-03-05 20:49
秋招专场
校招火热招聘中
官网直投
s2.salary >= s1.salary这句啥意思啊
3
送花
回复 分享
发布于 2021-04-22 09:43
使用窗口函数的方法是不是漏了按emp_no升序排这个条件?
2
送花
回复 分享
发布于 2021-03-09 21:10
因为用的是count去统计去重后的数量,大于等于最大值的只有一个(它本身),大于等于第二大值有两个(最大值和它本身),以此类推实现排序效果
1
送花
回复 分享
发布于 2021-05-31 15:20
不适用窗口函数的方法我改写为自连接了 select s1.emp_no, s1.salary, count(distinct s2.salary) as 'rank' from salaries s1, salaries s2 where s1.salary <= s2.salary group by s1.emp_no,s1.salary order by s1.salary desc
1
送花
回复 分享
发布于 2021-12-26 17:44
as 后面的rank一定要加引号,否则报错
1
送花
回复 分享
发布于 2022-12-05 15:46 山西
我做的和你一样
点赞
送花
回复 分享
发布于 2021-07-19 14:48
s2.salary >= s1.salary 这个的作用是什么呀 想不明白..求解释
点赞
送花
回复 分享
发布于 2021-08-03 10:05
子查询可以调用外部查询吗
点赞
送花
回复 分享
发布于 2021-12-31 16:34
真流弊
点赞
送花
回复 分享
发布于 2022-09-07 14:47 黑龙江

相关推荐

100 15 评论
分享
牛客网
牛客企业服务