【问题标题】:Grouping by aggregate function max in MySQLMySQL中按聚合函数最大值分组
【发布时间】:2018-08-28 06:09:52
【问题描述】:

我的表教练如下:

+-------+------------+------------+----------+
| ID    | name       | dept_name  | salary   |
+-------+------------+------------+----------+
| 10101 | Srinivasan | Comp. Sci. | 65000.00 |
| 12121 | Wu         | Finance    | 90000.00 |
| 15151 | Mozart     | Music      | 40000.00 |
| 22222 | Einstein   | Physics    | 95000.00 |
| 32343 | El Said    | History    | 60000.00 |
| 33456 | Gold       | Physics    | 87000.00 |
| 45565 | Katz       | Comp. Sci. | 75000.00 |
| 58583 | Califieri  | History    | 62000.00 |
| 76543 | Singh      | Finance    | 80000.00 |
| 76766 | Crick      | Biology    | 72000.00 |
| 83821 | Brandt     | Comp. Sci. | 92000.00 |
| 98345 | Kim        | Elec. Eng. | 80000.00 |
+-------+------------+------------+----------+

查询

 select dept_name, max(salary) from instructor group by dept_name;

会给我导师每个部门的最高薪水。

但是,我想获取结果中的所有列,即每个部门中薪水最高的教师的 IDname。但我不知道该怎么做。

【问题讨论】:

  • 此类问题已在 SO 中多次回答。如果你搜索 greatest per group mysql 你会得到很多例子。
  • @GiorgosBetsos This is the usual duplicate 人们正在标记。但是,接受的答案是糟糕的 IMO,你真的必须向下滚动一段时间才能找到看起来不错的东西。

标签: mysql sql group-by max


【解决方案1】:

您可以将当前查询用作过滤原始表的子查询:

SELECT i1.*
FROM instructor i1
INNER JOIN
(
    SELECT dept_name, MAX(salary) AS salary
    FROM instructor
    GROUP BY dept_name
) i2
    ON i1.dept_name = i2.dept_name AND i1.salary = i2.salary;

【讨论】:

    【解决方案2】:

    请使用以下查询:

    SELECT ID, name, dept_name, salary
    FROM( select ID, name, dept_name, salary, ROW_NUMBER() OVER(PARTITION BY  dept_name ORDER BY salary DESC) as ranks
     from instructor)T
     WHERE ranks = 1
    

    【讨论】:

    • 注意:此查询只能在 MySQL 8+ 或更高版本上运行。
    【解决方案3】:

    你也可以使用相关子查询

    select t.* from instructor  t
     where salary in
      ( 
        select  max(salary) from instructor t1 
        where t1.dept_name=t.dept_name
        group by t1.dept_name 
       )
    

    http://sqlfiddle.com/#!9/f7018c/1

    【讨论】:

      【解决方案4】:
      SELECT ins.id , ins.name 
      FROM instructor ins 
      inner join (
          SELECT ins2.id as id , MAX(ins2.salary) as salary 
          FROM instructor ins2 
          group by ins2.id
      ) as insG 
      ON ins.id = insG.id AND ins.salary = insG.salary
      

      【讨论】:

        【解决方案5】:

        您可以使用相关子查询:

        select i.*
        from instructor i
        where salary = (select max(i1.salary)
                        from instructor i1
                        where i1.dept_name = i.dept_name
                       );
        

        【讨论】:

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