【问题标题】:Get the name of the employee with the second highest salary [duplicate]获取薪水第二高的员工姓名[重复]
【发布时间】:2019-09-15 07:16:41
【问题描述】:

我必须得到薪水第二高的员工的姓名,我从中获取的表名是emp。我知道第二高薪水的查询是

select max(sal) 
from emp 
where sal < (select max(sal) from emp)

它有效,它返回正确的答案。

但我还必须得到员工的姓名。我只是尝试过

select name, max(sal) 
from emp 
where sal < (select max(sal) from emp)

我收到此错误:

ORA-00937: 不是单组群函数

我怎样才能删除错误以便同时获得姓名和薪水。 感谢任何提供帮助的人。

【问题讨论】:

    标签: sql oracle subquery top-n


    【解决方案1】:

    你可以使用

    select name,sal from emp where sal = (select max(sal) from emp where sal < (select max(sal) from emp));
    

    【讨论】:

    • 非常感谢先生。你能解释一下错误吗????
    • 当然。问题是 SELECT 不能同时具有组函数(例如 AVG、COUNT、MAX、MIN 等)和单个列表达式(例如名称或薪水)。在这种情况下,如果单个列表达式包含在 GROUP BY 子句中,则可以使用它。错误是说您尝试执行需要 GROUP BY 子句但没有 GROUP BY 子句的 SELECT 语句。希望这会有所帮助:)
    【解决方案2】:

    使用这个:

    with cte (
    select ROW_NUMBER() over(order by sal desc)rnum ,name,sal from emp )
    select * from cte where rnum = 2
    

    【讨论】:

      【解决方案3】:

      您可以使用窗口函数轻松实现这一点。试试这样的:

      SELECT name, sal
      FROM emp
      QUALIFY RANK OVER(ORDER BY sal DESC) = 2
      

      这将按薪水对您的行进行排序,然后为每一行提供一个排名。然后它将返回带有ranking = 2 的行。

      如果您想确保只返回一行,请将RANK 更改为ROW_NUMBER

      【讨论】:

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