【问题标题】:Find the highest salary of instructors in that department查找该部门教师的最高薪水
【发布时间】:2021-12-21 21:19:49
【问题描述】:

SQL 查询:针对每个部门,查找该部门教师的最高薪水。

Instructor schema: Instructor(ID , name, dept_name, Salary) Id 主键,dept_name 外键引用部门。

部门(部门名称、建筑、预算)

导师表值:

ID       Iname     dept_name    salary
10101   Srinivasan  Comp. Sci.  65000
12121   Wu          Finance     90000
15151   Mozart      Music       40000
22222   Einstein    Physics     95000
32343   El Said     History     60000
33456   Gold        Physics     87000
45565   Katz        Comp. Sci.  75000
58583   Califieri   History     62000
76543   Singh       Finance     80000
76766   Crick       Biology     72000
83821   Brandt      Comp. Sci.  92000
98345   Kim         Elec. Eng.  80000

如果我们尝试手动找出最高薪水,

Brandt      Comp. Sci
Wu          Finance
Mozart      Music
Einstein    Physics
Califieri   History
Crick       Biology 
Kim         Elec. Eng.

现在我运行这个查询,

select distinct 
       T.Iname, 
       T.dept_name 
  from instructor as T, 
       instructor as S 
 where T.salary > S.salary 
 group by T.dept_name;

我明白了

Kim Elec. Eng.
Brandt  Comp. Sci.
Crick   Biology
Singh   Finance
Gold    Physics
Califieri   History

我的金融和物理结果不正确,甚至音乐也没有包括在内。

我找不到我的错误。我想知道哪里需要修改?

谢谢。

【问题讨论】:

    标签: mysql sql select group-by


    【解决方案1】:

    试试这个:

      SELECT ID, Iname, dept_name, salary 
        FROM instructors
    GROUP BY Iname,dept_name 
    ORDER BY salary DESC ;
    

    【讨论】:

      【解决方案2】:

      我认为下面的 SQL 会起作用。

      select Iname, dept_name from instructor as t1 where t1.salary=(select max(salary) from instructor as t2 where t1.dept_name = t2.dept_name);
      

      select t1.Iname, t1.dept_name from instructor as t1 left join instructor as t2 on t1.dept_name = t2.dept_name and t1.salary < t2.salary where t2.dept_name is NULL;
      

      【讨论】:

        【解决方案3】:

        另一种方法是在子查询 td_1 中找到部门的最大薪水,然后使用薪水和部门将其与数据表连接

        select td.Iname, td.dept_name, td.salary
          from test_data td
          join (select max(salary) salary, dept_name
                  from test_data td 
                 where td.dept_name = dept_name
                 group by dept_name) td_1
            on td_1.dept_name = td.dept_name
           and td_1.salary = td.salary
        

        【讨论】:

          【解决方案4】:

          使用 EXISTS

           select T.Iname, 
                  T.dept_name 
           from instructor as T
           where not exists (select 1
                             from instructor as S
                             where S.dept_name = T.dept_name
                             and T.salary < S.salary);
          

          【讨论】:

            【解决方案5】:

            在 MySQL 8+ 上,使用RANK 可以轻松处理此问题:

            WITH cte AS (
                SELECT *, RANK() OVER (PARTITION BY dept_name ORDER BY salary DESC) rnk
                FROM department
            )
            
            SELECT Iname, dept_name, salary
            FROM cte
            WHERE rnk = 1;
            

            请注意,如果出现平局,以上将报告给定部门内的两名或多名教师共享最高薪水。

            【讨论】:

              猜你喜欢
              • 2015-11-20
              • 1970-01-01
              • 2019-10-03
              • 2021-03-04
              • 1970-01-01
              • 1970-01-01
              • 2022-01-07
              • 1970-01-01
              相关资源
              最近更新 更多