题目要求:获取所有部门中员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号升序排列。
错误总结:1).groupby子句常见错误
SELECT 子句中只能存在以下三种元素。
● 常数 ● 聚合函数 ● GROUP BY子句中指定的列名(也就是聚合键)
#错误用法 SELECT product_name, purchase_price, COUNT(*) -- 列名product_name不能包含 FROM Product GROUP BY purchase_price;
2).同一部门存在多个拿最高薪的员工, 怎么办?
个人思路:创建临时表T1,T2。T1获取两表部门编号dept_no以及对应的最高薪maxSalary记录。T2获取两表对应的部门编号dept_no、工资salary和员工编号emp_no记录。T1 join T2 on T1.maxSalary =T2.salary and T1.dept_no=T2.dept_no。T1连接T2条件为相同部门编号下员工的薪资等于最高薪资。
代码:
select T1.dept_no,T2.emp_no,T1.maxSalary from ( select de.dept_no,max(salary) as maxSalary from dept_emp de join salaries sa on de.emp_no=sa.emp_no group by dept_no )as T1 join ( select de.dept_no,sa.salary,sa.emp_no from dept_emp de join salaries sa on de.emp_no=sa.emp_no )as T2 on T1.maxSalary =T2.salary and T1.dept_no=T2.dept_no order by dept_no
2021-9-16二刷(Mysql、sqlite都可用):窗口函数,基本一样的思路以部门分组对薪水做排名,然后找到排第一的那个
select dept_no,emp_no,salary from ( select dept_no,t1.emp_no,salary, (rank() over(partition by dept_no order by salary desc) ) as s_rank from dept_emp t1 join salaries t2 on t1.emp_no=t2.emp_no order by dept_no ) as t where t.s_rank =1