我编写了以下SQL命令,用于从名为Employee
的表中检索数据。
我能够获得最高/最高薪水以及第二最高/最高薪水,但是当需要返回整个记录时,我很难编写相同的文字。
选择所有员工。
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
作为额外条件,但是我安排它来指定条件,但出现语法错误。我该怎么做?
答案 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);