题目要求:获取所有部门中员工薪水最高的相关信息,给出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_no2021-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

京公网安备 11010502036488号