sql server中的CTE返回空值但不是空值问题

sql server中的CTE返回空值但不是空值问题,sql,sql-server,sql-order-by,greatest-n-per-group,Sql,Sql Server,Sql Order By,Greatest N Per Group,这是一个经典问题:编写一个SQL查询,从Employee表中获取第二高的薪资 +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 例如,给定上述Employee表,查询应返回200作为第二高工资。如果没有第二高工资,则查询应返回null +---------------------+ | SecondHighestSalar

这是一个经典问题:编写一个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]是问题所在,但我不知道为什么或者如何解决它

输入 {“headers”:{“Employee”:[“Id”,“Salary”]},行:{“Employee”:[[1100]]} 输出 {“headers”:[“SecondHighestSalary”],“values”:[]} 预期 {“headers”:[“SecondHighestSalary”],“value”:[[null]]}

我用Max()解决了这个问题,没有问题。空值不是问题。(为什么?)


非常感谢您的时间。

您的尝试对我来说很好-您只需按降序而不是升序排列薪资:

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
根据您希望如何处理关系,您可能希望使用
densite\u rank()
而不是
row\u number()
(这将返回第二个不同的最高值,即使第一个或第二个位置存在关系)

如果您不关心关系,请注意,使用
fetch
子句可以以更简单的方式获得相同的结果:

select salary as secondhighestsalary
from employee
order by salary desc
offset 1 row fetch next 1 row only

我很感激GMB所提供的,因为这两种解决方案都未能通过测试

这里的技巧是:当没有可选择的行时,MAX返回NULL。
有一些使用case语句的解决方案适用于Mysql,但使用t-sql则很棘手

select nullif(salary,'') as SecondHighestSalary  from sal where rnk=2;
理想情况下,这应该是可行的,但它似乎代表空白,“”是不够的。许多人使用计数函数作为解决方法,同样,它只是在幕后进行一些分析,双重计算,类似于max()所做的


如果有人能解决这个问题,我会非常高兴。

非常感谢您提供了更简单的方式!我在代码中添加了desc,但仍然返回为错误。认为它期望[null]作为输出。知道为什么吗?
select nullif(salary,'') as SecondHighestSalary  from sal where rnk=2;