假设我有两张桌子(下方)。编写一个选择以获得每个部门薪水最高的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
答案 0 :(得分:3)
此类选择的最佳选择是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
答案 1 :(得分:1)
您可以像这样使用ROW_NUMBER()
。
;WITH CTE as
(
SELECT employee_name,Salary,department_id,
ROW_NUMBER()OVER(PARTITION BY department_id ORDER BY Salary DESC) rn
FROM Employee
)
SELECT employee_name,Salary,d.department_id,d.name
FROM CTE c
INNER JOIN Departments d ON d.department_id = c.department_id
WHERE rn <= 2
答案 2 :(得分:1)
这种CTE
方法非常有效
使用此代码:
Create TABLE #table
(
name varchar(10),
salary varchar(10),
depid int
)
insert into #table values('John','65000',1)
insert into #table values('Sally','60000',1)
insert into #table values('Connor','55000',1)
insert into #table values('Judy','55000',1)
insert into #table values('Lucy','65000',2)
insert into #table values('Kevin','55000',2)
insert into #table values('Ram','60000',2)
insert into #table values('James','80000',3)
insert into #table values('Harry','65000',3)
insert into #table values('Penny','56000',3)
select * from #table
;With CTE as
(
select name,salary,depid,ROW_NUMBER() over(partition by depid order by salary desc) as maxisal from #table
)
select name,salary,depid from CTE
where maxisal<=2
编辑:将maxi更改为maxisal以使其工作 - Fuzzyjulz
注意:我为Depid 2添加了两个条目
<强>输出:强>
name salary depid
John 65000 1
Sally 60000 1
Lucy 65000 2
Ram 60000 2
James 80000 3
Harry 65000 3