sql—选择具有“第二”最高值的记录

izkcnapc  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(345)

我编写了以下sql命令,用于从名为 Employee .
我能够得到最高/最高的薪水以及第二高/最高的薪水,但是当需要返回整个记录时,我很难写出同样的内容。

选择所有员工。

SELECT * FROM Employee

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

SELECT MAX(salary) FROM Employee

返回薪资最高的员工记录。这将返回该人员的所有记录,其工资为最高工资90000,在本例中仅为john henry。

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

归还所有其他员工的记录;i、 e.除了薪水最高的人以外的所有人。

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

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

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

返回工资第二高的员工记录。这将返回该人员的所有记录,他们的工资是第二个最高工资,即85000美元,在本例中仅为michael greenback。
我被困在这个。。。我试过用 HAVING 作为一个额外的条件,但是不管我如何安排它来指定一个条件,我都会得到语法错误。我该怎么做?

toe95027

toe950271#

窗口函数是实现这一点的内置功能。特别地, dense_rank() :

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

kuarbcqp2#

这是一个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);

相关问题