【问题标题】:Find the employee with max salary in his department找到他所在部门薪水最高的员工
【发布时间】:2015-11-20 16:18:36
【问题描述】:

表结构如下

id  dept    salary
1   30  2000
2   20  5500
3   30  6700
4   30  8900
5   30  9900
6   10  1120
7   20  8900
8   10  2400
9   30  2600
10  10  2999

我需要输出有两列:

身份证和工资

Id 应该是唯一的,salary 应该是最高薪水

【问题讨论】:

  • 它是什么?甲骨文还是赛贝斯?请提供所需的输出,我不清楚你在问什么。
  • 到目前为止你尝试了什么?
  • 这个问题在 SO 上被问了太多次了。
  • select max salary in sql的可能重复
  • @FutbolFan:如果这确实是重复的,那就是一个糟糕的公式。

标签: sql oracle max sybase


【解决方案1】:

如果同一部门内没有其他员工的薪水更高,请使用NOT EXISTS 退回员工。

select * from table t1
where not exists (select 1 from table t2
                  where t2.dept = t1.dept
                    and t2.salary > t1.salary)

核心 SQL-99,可与 Oracle 和 Sybase 一起使用!

替代方案:

select * from table
where (dept, salary) = (select dept, max(salary)
                        from table
                        group by dept)

在 Core SQL-2003 之外使用以下功能:F641,“行和表构造函数”。 (这里不知道Sybase和Oracle支持什么...)

【讨论】:

  • 查询有效。但是对于超过一个 lac 行,它可能会由于不存在而导致性能问题
【解决方案2】:
SELECT ID,Salary FROM TABLE_NAME WHERE SALARY =(SELECT MAX(SALARY) FROM TABLE_NAME)

【讨论】:

  • 这只会返回一行 Raj
  • @Nigel:如果您阅读了您的问题,从技术上讲,这正是您所要求的。
  • 你也要考虑部门!
【解决方案3】:
SELECT a.Id, a.Salary
FROM table a
WHERE a.Salary = (SELECT MAX(Salary) FROM table
                  WHERE Id = a.Id)

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
【解决方案4】:
select * from (select * from dep order by salary desc, dep, id) t
group by t.dep

【讨论】:

    【解决方案5】:

    使用单次扫描:

    WITH SALARIES AS (
        SELECT 1  ID, 30 DEPT, 2000 SALARY FROM DUAL UNION ALL
        SELECT 2  ID, 20 DEPT, 5500 SALARY FROM DUAL UNION ALL
        SELECT 3  ID, 30 DEPT, 6700 SALARY FROM DUAL UNION ALL
        SELECT 4  ID, 30 DEPT, 8900 SALARY FROM DUAL UNION ALL
        SELECT 5  ID, 30 DEPT, 9900 SALARY FROM DUAL UNION ALL
        SELECT 6  ID, 10 DEPT, 1120 SALARY FROM DUAL UNION ALL
        SELECT 7  ID, 20 DEPT, 8900 SALARY FROM DUAL UNION ALL
        SELECT 8  ID, 10 DEPT, 2400 SALARY FROM DUAL UNION ALL
        SELECT 9  ID, 30 DEPT, 2600 SALARY FROM DUAL UNION ALL
        SELECT 10 ID, 10 DEPT, 2999 SALARY FROM DUAL
    )
    SELECT
        MAX(ID) KEEP (DENSE_RANK LAST ORDER BY SALARY) ID,
        MAX(SALARY) SALARY
    FROM
        SALARIES
    GROUP BY
        DEPT;
    

    【讨论】:

      【解决方案6】:

      以下三个查询都有效:

      select t.dept, t.salary
      from
      (select dept,max(salary) as m_sal from tempdb..test
      group by dept)x, tempdb..test t
      where x.dept = t.dept
      and x.m_sal = t.salary
      
      select dept, id, salary as m_sal 
      from tempdb..test t1
      where salary = (select max(salary) from tempdb..test t2 where t2.dept = t1.dept)
      
      
      select t1.dept,t1.salary from tempdb..test t1 
      inner join
      (select dept,max(salary) as m_sal from tempdb..test 
      group by dept)x on
      t1.salary=x.m_sal and
      t1.dept=x.dept
      

      【讨论】:

      • 有效的逻辑是找到每个部门的最高工资并将其插入临时表中。然后比较工资和部门
      【解决方案7】:

      虽然数据结构有点奇怪,但下面的查询会给出想要的结果:

       create table #tmp(
            id numeric(10,0),
            dept int,
            salary numeric(10,0))
      
          insert #tmp select 1,   30,  2000
          insert #tmp select 2,   20,  5500
          insert #tmp select 3,   30,  6700
          insert #tmp select 4,   30,  8900
          insert #tmp select 5,   30,  9900
          insert #tmp select 6,   10,  1120
          insert #tmp select 7,   20,  8900
          insert #tmp select 8,   10,  2400
          insert #tmp select 9,   30,  2600
          insert #tmp select 10,  10,  2999
      
          select * from #tmp order by dept  
      
          id           dept        salary       
          ------------ ----------- ------------ 
                     6          10         1120 
                     8          10         2400 
                    10          10         2999 
                     2          20         5500 
                     7          20         8900 
                     1          30         2000 
                     9          30         2600 
                     3          30         6700 
                     4          30         8900 
                     5          30         9900 
      
          select id, salary
            from #tmp t1, (select dept=dept, salaryMax=max(salary) from #tmp group by dept) t2
           where t1.dept = t2.dept  
             and t1.salary = t2.salaryMax
      
      id           salary       
      ------------ ------------ 
                 7         8900 
                10         2999 
                 5         9900 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 2021-03-04
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多