sql - 如何返回表中每一行的 X 最大行

标签 sql sql-server

假设我有两个表(如下)。编写选择以获取每个部门薪水最高的 2 名员工的最佳方法是什么?假设可能有很多部门。

输出:

employee_name | salary | department_id
John          | 65000  | 1
Sally         | 60000  | 1
Lucy          | 40000  | 2
James         | 80000  | 3
Harry         | 65000  | 3

表格:

员工

employee_name | salary | department_id
John          | 65000  | 1
Sally         | 60000  | 1
Connor        | 55000  | 1
Judy          | 55000  | 1
Lucy          | 40000  | 2
James         | 80000  | 3
Harry         | 65000  | 3
Penny         | 56000  | 3

部门

department_id | name
1             | Sales
2             | Marketing
3             | IT

最佳答案

此类选择的最佳选择是OUTER APPLY。它专为此类工作而设计:

select d.department_id, oa.employee_name, oa.salary
from Departments d
outer apply(select top 2 e.employee_name, e.salary 
            from Employee e 
            where d.department_id = e.department_id 
            order by e.salary desc) oa

如果您不想让部门没有员工,那么只需将 outer apply 更改为 cross apply

关于sql - 如何返回表中每一行的 X 最大行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30526186/

相关文章:

mysql - sql查询速度的问题

mysql - 如何存储数字序列(或其他集合中的字符序列)?

sql - 使用 SQL Server 代理作业发送 HTTP 请求

用于选择并返回值的 SQL Server CTE

sql-server - 为什么 SQL Server SET DEADLOCK_PRIORITY HIGH 不被遵守?

sql - 如何从 Crystal Reports 调用存储过程?

mysql - SQL 内连接选择字段列表

sql-server - 困惑: Why SSMS creates a default clustered index for a primary key with an identity

sql-server - SQL Server 默认值是在插入之前还是之后生成的?

sql - 将多行转换为多列