如何为表

时间:2015-05-29 09:39:16

标签: 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

3 个答案:

答案 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