这是一个经典的问题:编写一个SQL查询以从Employee表中获得第二高的工资。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如,给定上面的Employee表,查询应该返回200作为第二高工资。如果没有第二高工资,那么查询应该返回null。
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
我在SQL server中使用CTE来解决这个问题:
with Emp_Rank AS
(select Salary, row_number()over(order by Salary) as Salrank
from Employee)
Select Salary as SecondHighestSalary
from Emp_Rank
where Emp_Rank.Salrank = 2
答案不被接受,如下所示。我认为[]vs[null]是个问题,但我不知道为什么或如何解决它。
输入{"标题":{"雇员":["Id","工资"]},";行":{"雇员":[[1100]]}}输出{"头":["第二高薪"],"值":[]}预期{"头":["第二高薪"],"值":[[null]]}
Ps,我用Max((解决了这个问题。null不是问题。(为什么?(
非常感谢您抽出时间。
你的尝试对我来说很好-你只需要按降序而不是升序排列工资:
with emp_rank as (
select salary, row_number()over(order by salary desc) as salrank
from employee
)
select salary as secondhighestsalary
from emp_rank
where salrank = 2
根据您希望如何处理平局,您可能希望使用dense_rank()
而不是row_number()
(这将返回第二个不同的最高值,即使在第一个或第二个位置有平局(。
如果您不关心关系,请注意,使用fetch
子句可以以更简单的方式获得相同的结果:
select salary as secondhighestsalary
from employee
order by salary desc
offset 1 row fetch next 1 row only
我很欣赏GMB所提供的,在这两个解决方案都未能通过问题的测试用例方面。
with sal(salary, rnk) as
(select salary,dense_rank() over( order by Salary desc ) as rnk from Employee)
select max(salary) as SecondHighestSalary from sal where rnk=2;
这里的诀窍是:当没有行可供选择时,MAX返回NULL
有些带有case语句的解决方案适用于Mysql,但使用t-sql则很棘手。
select nullif(salary,'') as SecondHighestSalary from sal where rnk=2;
理想情况下,这应该有效,但它似乎代表空白,"是不够的。许多人使用count函数作为变通方法,同样,它只是在引擎盖下进行一些分析、对偶计算,类似于max((的功能。
如果有人能让努利夫解决这个问题,那就太高兴了。