这个题目同样可以利用窗口函数ROW_NUMBER()或RANK()或DENSE_RANK()来办理。以下是利用ROW_NUMBER()的SQL语句:
sql复制代码
WITH ranked_employees AS ( SELECT empno, ename, JOB, sal, dept, ROW_NUMBER() OVER(PARTITION BY JOB ORDER BY sal DESC) as rank FROM Bank_emp ) SELECT empno, ename, JOB, sal, dept, rank FROM ranked_employees WHERE rank <= 10;
在这个查询中,我们先在ranked_employees的CTE中,为每个岗位的每个员工分配一个基于其工资降序排列的排名。然后,在主查询中,我们只选择每个岗位的排名在前10位的员工。
注意,如果你想在同一岗位、同一工资下有多个员工共享同一排名,可以利用RANK()或DENSE_RANK()代替ROW_NUMBER()。
将SQL复制到Navicat中进行测试;
要查询工资大于全部人力资源部员工的员工信息,您可以利用下列SQL语句。它首先在子查询中找到人力资源部的最高工资,然后在主查询中查找工资高于这个值的全部员工。
sql复制代码
SELECT empno, ename, JOB, sal, dept FROM Bank_emp WHERE sal > ( SELECT MAX(sal) FROM Bank_emp WHERE dept = '人力资源部' );
在这个查询中,“SELECT MAX(sal) FROM Bank_emp WHERE dept = '人力资源部'”是一个子查询,它会返回人力资源部的最高工资。然后,主查询将找出工资大于这个值的全部员工。请注意,这个语句假设'dept'列包含部分名称,如'人力资源部'。如果您的表结构差别,可能需要稍微修改这个查询以顺应您的需求。
将SQL复制到Navicat中进行测试;
要查询每个岗位下工资最高的员工信息,可以利用窗口函数ROW_NUMBER()配合OVER()子句。假设同一岗位、同一工资下只有一个员工,SQL语句如下:
sql复制代码
WITH ranked_employees AS ( SELECT empno, ename, JOB, sal, dept, ROW_NUMBER() OVER(PARTITION BY JOB ORDER BY sal DESC) as rank FROM Bank_emp ) SELECT empno, ename, JOB, sal, dept FROM ranked_employees WHERE rank = 1;
这个查询首先在ranked_employees的CTE (Common Table Expressions,即公用表表达式) 中,为每个岗位的每个员工分配一个基于其工资降序排列的排名。然后,在主查询中,我们只选择每个岗位的排名为1(即工资最高)的员工。
如果同一岗位、同一工资下可能有多个员工,可以利用RANK()或DENSE_RANK()代替ROW_NUMBER(),如许会为具有相同工资的员工分配相同的排名。
将SQL复制到Navicat中进行测试;