消息关闭
    暂无新消息!
部门 工资 前三名  

该Employee表包含所有员工。每个员工都有一个ID,并且还有一个部门ID的列。

+ ---- + ------- + -------- + -------------- +
| Id | Name| salary| DepartmentId |
+ ---- + ------- + -------- + -------------- +
| 1 | 乔| 70000 | 1 |
| 2 | 亨利| 80000 | 2 |
| 3 | 山姆| 60000 | 2 |
| 4 | Max | 90000 | 1 |
| 5 | 珍妮特| 69000 | 1 |
| 6 | 兰迪| 85000 | 1 |
+ ---- + ------- + -------- + -------------- +
该Department表包含公司的所有部门。

+ ---- + ---------- +
| Id | Department|
+ ---- + ---------- +
| 1 | IT |
| 2 | 销售|
+ ---- + ---------- +
编写一个SQL查询来查找每个部门获得前三名薪水的员工。对于上述表,您的SQL查询应返回以下行。

+ ------------ + ---------- + -------- +
| Department| employeeName| Salary|
+ ------------ + ---------- + -------- +
| IT | Max | 90000 |
| IT | 兰迪| 85000 |
| IT | 乔| 70000 |
| 销售| 亨利| 80000 |
| 销售| 山姆| 60000 |
+ ------------ + ---------- + -------- +

求教,高手,这周复杂的SQL题一边怎么做?

3个回答

︿ 2
select * from (
select b.Department,a.name,a.salary
row_number() over(partition by b.Department order by a.salary desc) rn
 from Employee a 
left join Department b on a.DepartmentId  = b.Id
) temp
where temp.rn<4 
order by temp.rn 
︿ 1
如果工资相同也只找出3个人的话就这样,如果是要找出排工资前3名的所有员工就把ROW_NUMBER()换成dense_rank()就可以。
WITH T AS (
SELECT ROW_NUMBER() OVER(PARTITION BY D.ID ORDER BY E.SALARY) XH, D.DEPARTMENT, E.EMPLOYEENAME, E.SALARY
  FROM EMPLOYEE E, DEPARTMENT D
 WHERE E.DEPARTMENTID(+) = D.ID
)SELECT DEPARTMENT,EMPLOYEENAME,SALARY FROM T WHERE XH < 4;
︿ 0
row_number() over(partition by 列 order by 列)
例如:http://blog.csdn.net/iw1210/article/details/11937085