如果出现以下情况,则必须返回 Null:
- 表中少于 2 行
- 没有第二高的薪水,因为每个人的薪水都一样
我查找的所有内容似乎都是针对旧版本的 Sql Server
DECLARE @find int = (Select COUNT(*) from Employee);
IF (@find = 1)
select null as 'SecondHighest'
else
select Salary as 'SecondHighest'
from Employee
order by Salary desc
offset 1 rows fetch next 1 rows only;
如果少于 2 列,我设法返回 null,尽管我认为可能有更好的方法来做到这一点。
但是,我无法解决第二个问题:
“没有第二高的薪水,因为每个人的薪水都一样”
这里有一个与@alx类似的方法(顺便说一句,这很好,很简单,所以+1),但更容易概括地选择第n个最高薪水:
SELECT MAX(Salary)
FROM
(
SELECT Salary, DENSE_RANK() OVER(ORDER BY Salary DESC) AS Rank
FROM Employee
) E
WHERE (Rank = 2);
看看这个方法:http://sqlfiddle.com/#!9/dfb2cf/3
这是查询:
select max(Salary) from Employee where Salary < (select max(Salary) from Employee);
这是数据:
create table Employee (Id int, Salary int);
insert into Employee values
(1, 100),
(2, 200),
(3, 300);
查询输出
200
,这是正确答案。我想它也适用于 SQL Server。
对于一条记录的边缘情况,它输出
null
,即内部有 null
的单行,而不是零行结果。
declare @maxCount int = (select count(*) from Employee);
if(@maxCount >= 2) 开始 ;将 CTE_SecondHigest 作为 ( 按工资描述从员工订单中选择前 2 个工资) 从 CTE_SecondHigest 按工资顺序选择前 1 个工资 [SecondHighestSalary] 结尾 别的 开始 选择 null [SecondHighestSalary] 结束