“部门 工资 前三名 ”典型复杂的SQL题

kingmax54212008 2017-06-30 04:49:56
部门 工资 前三名

该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题一边怎么做?
...全文
862 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
雨巷啊 2017-06-30
  • 打赏
  • 举报
回复
如果工资相同也只找出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;
alex259 2017-06-30
  • 打赏
  • 举报
回复
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 
zbdzjx 2017-06-30
  • 打赏
  • 举报
回复
row_number() over(partition by 列 order by 列) 例如:http://blog.csdn.net/iw1210/article/details/11937085

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧