【问题标题】:如何选择未在group by子句中列出的列[重复]
【发布时间】:2022-01-23 16:58:58
【问题描述】:

根据每个部门的最高工资从表中选择 id

表格

Id dept salary
1 support 25000
2 support 20000
3 development 35000
4 development 25000
5 development 30000
select Id from table
where salary In (select max(salary) from table group by dept)

如果像这样运行查询,我会得到类似的输出

Id
1
3
4

我使用排名窗口函数和 CTE 来解决这个查询

with rank_message as (select id,dept,
ROW_NUMBER() over (partition by dept order by salary desc) as sal
from table S)
select id,dept from rank_message where sal=1

【问题讨论】:

标签: mysql sql group-by aggregate-functions greatest-n-per-group


【解决方案1】:
select Id from table as t1 inner join 
    (select id, max(salary) from table  group by dept) as t2 on t1.id= t2.id

【讨论】:

  • 分组不完整。可能(将)给出不正确的输出。
【解决方案2】:

我们可以返回dept列的值,以及每个部门的最高工资:

SELECT m.dept
     , MAX(m.salary) AS max_salary 
  FROM mytable m
 GROUP
    BY m.dept

我们可以将其转换为内联视图(或“派生表”)并将其连接到原始表。我们可以获得与行匹配的详细行(关于部门和最高工资)

SELECT t.id
--   , t.dept
--   , t.salary
  FROM ( 
         -- maximum salary from each dept
         SELECT m.dept
              , MAX(m.salary) AS max_salary 
           FROM mytable m
          GROUP
             BY m.dept

       ) s
  JOIN mytable t
    ON t.dept   = s.dept
   AND t.salary = s.max_salary
 ORDER
    BY t.id

请注意,如果 mytable 中有两个(或更多)行具有相同部门的相同最高工资,则将返回两个(或所有)匹配的行。

作为一个演示,考虑如果将行 (5,'support',35000) 添加到 mytable 中查询将返回什么。现在“支持”部门中有两行具有相同的最高薪水。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-11
    • 2020-01-01
    • 2012-09-05
    • 1970-01-01
    • 2021-11-17
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多