【问题标题】:Selecting the record(s) with the "second" highest something选择“第二”最高的记录
【发布时间】:2020-08-01 15:31:56
【问题描述】:

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

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

选择所有员工。

SELECT * FROM Employee

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

SELECT MAX(salary) FROM Employee

返回工资最高的员工记录。这将返回该人的所有记录,他们的薪水是最高薪水,即 90000,在这种情况下只有 John Henry。

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,在这种情况下只有 Michael Greenback。

我被困在这个...我尝试使用HAVING 作为额外条件,但是我安排它来指定一个条件,我得到语法错误。我该怎么做?

【问题讨论】:

    标签: sql


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这是一个 SQL Server 解决方案,但可以使用 limit N 而不是 top N 轻松重写。如果你的数据库不支持window functions,你可以试试这个。如果是这样,Gordon 的解决方案就是可行的方法。

      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);
      

      【讨论】:

      • 感谢 Gordon 的这个有用的替代方法。
      猜你喜欢
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多