【问题标题】:Get second highest salary, return null if no second highest获得第二高的薪水,如果没有第二高则返回 null
【发布时间】:2019-06-22 23:33:21
【问题描述】:

如果出现以下情况,则必须返回 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,尽管我认为可能有更好的方法来做到这一点。 但是,我无法解决第二个问题:
“没有第二高的薪水,因为每个人的薪水都一样”

【问题讨论】:

  • 您可以通过查询找到最高薪水,在子查询中找到低于最高薪水的薪水。如果没有第二高,我猜它会自动变成null。
  • @alx 不幸的是,它不会自动变为空,它只是空的(没有行)。我想要 1 行 null
  • 您的意思是“少于 2 ”吗?
  • 下面看我的回复,好像输出的正是你想要的。

标签: sql sql-server tsql


【解决方案1】:

这里有一个与@alx 类似的方法(顺便说一句,这很简单,所以 +1),但更容易概括为选择第 n 高薪水:

SELECT MAX(Salary)
FROM
(
  SELECT Salary, DENSE_RANK() OVER(ORDER BY Salary DESC) AS Rank
  FROM Employee
) E
WHERE (Rank = 2);

【讨论】:

  • 有没有办法在 SELECT 行中使用 ISNULL() 而不是 MAX() 而无需更改解决方案的其余部分?
  • 给定一个单项表,我想让它返回一个空表(如this),但只返回一个零行表,如(this)。
【解决方案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 服务器。

对于有一条记录的边缘情况,它输出null,即内部带有null 的单行,而不是零行结果。

【讨论】:

    猜你喜欢
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2011-12-20
    • 2018-06-20
    • 2011-01-30
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多