sql server中的CTE返回空值,但没有NULL问题



这是一个经典的问题:编写一个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((的功能。

如果有人能让努利夫解决这个问题,那就太高兴了。

最新更新