如何编写 SQL 来选择具有每个组的最大值(值)的行?

Posted

技术标签:

【中文标题】如何编写 SQL 来选择具有每个组的最大值(值)的行?【英文标题】:How to write SQL to select rows that has the max(value) of each group? 【发布时间】:2019-12-03 19:59:46 【问题描述】:

表格如下:

employee, department, salary

Jack, 1, 400
Greg, 2, 350
John, 1, 450
Kate, 2, 420
Jane, 3, 300
Jessy, 2, 400
Kevin, 3, 380

我想做的:选择包含各部门最高工资的行,我希望返回:

John,  1, 450
Jessy, 2, 400
Kevin, 3, 380

这里对于部门 1,John 的薪水最高,所以我选择了这一整行。

这个SQL怎么写?

【问题讨论】:

你的 rdbms 是什么? Sql Server、postgres、oracle? 如果一个部门的两个人的最高薪水相同,预期的结果是什么 - 你想要两个人还是一个人? 【参考方案1】:

一种方法使用相关子查询:

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

【讨论】:

【参考方案2】:

我通常使用窗口函数来解决这个问题:

select employee, department, salary
from (
  select employee, department, salary, 
         dense_rank() over (partition by department order by salary desc) as rnk
  from employee_table
) t
where rnk = 1;

【讨论】:

【参考方案3】:

select e1.* from employee e1 where e1.salary in (select max(e2.salary) from employee e2 where e2.department = e1.department);

【讨论】:

以上是关于如何编写 SQL 来选择具有每个组的最大值(值)的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 hive sql 中获取每个组的最大 row_number()

获取 ActiveRecord 中每个组的最小值/最大值

如何编写查询以获取 SQL Server 中每个组的第一个条目? [复制]

SQL:查找每组的最大记录[重复]

SQL:查找每组的最大记录[重复]

每个组的本地最大值的 SQL 排序结果