选择“第二”最高的记录

时间:2020-08-01 15:31:56

标签: sql

我编写了以下SQL命令,用于从名为Employee的表中检索数据。

我能够获得最高/最高薪水以及第二最高/最高薪水,但是当需要返回整个记录时,我很难编写相同的文字。

enter image description here

选择所有员工。

SELECT * FROM Employee

返回最高薪水。这将返回最高工资金额90000

SELECT MAX(salary) FROM Employee

返回薪水最高的员工记录。这将返回此人的所有记录,他们的薪水是最高工资90000,在这种情况下只有约翰·亨利。

SELECT *
FROM Employee
WHERE salary = ( SELECT MAX(salary) FROM Employee )

返回所有其他员工记录;即除薪水最高的人之外的所有人。

SELECT *
FROM Employee
WHERE salary != ( SELECT MAX(salary) FROM Employee )

返回第二高的薪水。这将返回第二个最高工资金额85000

SELECT MAX(salary) FROM Employee
WHERE salary != ( SELECT MAX(salary) FROM Employee )

返回薪水第二高的员工记录。这将返回此人的所有记录,他们的薪水是第二个最高薪水,即85000,在这种情况下只有迈克尔·格林贝克。

我陷入了困境...我尝试使用HAVING作为额外条件,但是我安排它来指定条件,但出现语法错误。我该怎么做?

2 个答案:

答案 0 :(得分:2)

窗口功能是执行此操作的内置功能。特别是dense_rank()

select e.*
from (select e.*, dense_rank() over (order by salary desc) as seqnum
      from employee e
     ) e
where seqnum = 2;

答案 1 :(得分:1)

这是一个SQL Server解决方案,但是可以使用limit N而不是top N轻松地重写。如果您的数据库不支持window functions,则可以尝试此操作。如果可以,那么戈登的解决方案就是解决之道。

with cte as

(select max(salary) as second_max
 from employee
 where salary in (select distinct top 2 salary -- top n is what makes this scalable
                  from employee
                  order by salary asc)) -- get top 2 salaries and sort them
select * 
from employee 
where salary = (select second_max from cte);