【问题标题】:Find first highest salary employee under manager查找经理下的第一个最高薪员工
【发布时间】:2019-11-02 13:00:10
【问题描述】:

员工表中的数据存储如下

Empno ename  salary manager

1     prasad 100    4
2     durga  200    4
3     ggggg  200    4
4     jjjjj  300    6
5     kkkkk  600    6
6     dddddd 700    7

我需要找出经理下薪水最高的员工。

我的sql代码和输出:

select * from employee where salary in
         (select max(salary) from employee group by manager);

输出:

Empno ename  salary manager

2     durga  200    4
3     ggggg  200    4
5     kkkkk  600    6
6     dddddd 700    7

预期的输出应该是:

2     durga  200    4
5     kkkkk  600    6
6     dddddd 700    7

因为薪水“200”为两名员工显示了两次。我的要求是仅在经理下显示最高薪员工。

任何人都可以为我的预期输出建议 sql 查询。提前致谢

【问题讨论】:

  • 谁是“第一位员工”? durga 还是 ggggg?为什么?
  • durga 或 ggggg 都可以。每个最高薪水我只需要一行
  • 嗯,你为什么要销毁所有格式?
  • @AvinKavish 不明白
  • Gordon 正确格式化了代码以使其可读,现在它只是一堵文字墙。

标签: sql oracle


【解决方案1】:

您可以使用ROW_NUMBER 窗口函数。例如:

select 
  empno, ename, salary, manager
from (
  select *, 
    row_number() over(partition by manager order by salary desc, ename) as rn
  from employee
) x where rn = 1

【讨论】:

  • 哪个成本最低,你的还是 Gordon 的?解释分析
  • 这取决于大量参数。引擎模型、索引的存在、表的大小、最新的表统计信息、算法库等等。不是非黑即白的答案。
  • 这是一个通用的解决方案。您需要使其适应您的特定数据库引擎。顺便问一下,您使用的是什么数据库和版本?
  • 使用 oracle 数据库
  • 看起来 Impaler 赢得了 SQL 之战
【解决方案2】:

试试这个查询:

SELECT ename, manager, MAX(salary) FROM employee GROUP BY manager;

现场示例:


编辑: Oracle 数据库

SELECT manager, MAX(salary) FROM employee GROUP BY manager;

【讨论】:

  • 这不会选择第一个员工,是吗?
  • @user2155454 你的数据库是什么?
  • oracle database.getting below error ORA-00979: not a GROUP BY expression 00979. 00000 - "not a GROUP BY expression"
  • 等等,这个活生生的例子是在 SQLite 中。正如我之前所说,这将不起作用。您不能拥有未出现在 group by 子句中的聚合函数和其他列选择
  • @ℛɑƒæĿ ename,empno 丢失
【解决方案3】:

使用相关子查询,而不是group by

select e.*
from employee e
where e.salary = (select max(e2.salary)
                  from employee e2
                  where e2.manager = e.manager
                 );

您的问题是,一位经理的最高薪水可能是其他人的薪水,但不是该经理的最高薪水。

【讨论】:

  • 仍然工资200显示两次
  • 这不区分重复工资,是吗?最终选择仅受薪水限制。
猜你喜欢
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
相关资源
最近更新 更多