SQL 12) 获取所有部门中当前员工当前薪水最高的相关信息

获取每个部门中当前员工薪水最高的相关信息

http://www.nowcoder.com/questionTerminal/4a052e3e1df5435880d4353eb18a91c6

方法1)开窗函数 PARTITION BY
SELECT a.dept_no, a.emp_no, a.salary
FROM(
    SELECT de.dept_no,de.emp_no,s.salary, rank() over(PARTITION BY de.dept_no ORDER BY s.salary DESC) rank_n
    FROM dept_emp AS de JOIN salaries AS s
    ON de.emp_no=s.emp_no
    WHERE s.to_date='9999-01-01'
    AND de.to_date='9999-01-01')a
WHERE a.rank_n = 1;

方法2)开窗函数 PARTITION BY 
SELECT a.dept_no,a.emp_no,a.salary 
FROM(
    SELECT de.dept_no,de.emp_no,s.salary, rank() over(PARTITION BY de.dept_no ORDER BY s.salary DESC) AS rank_num
    FROM (
        SELECT * 
        FROM dept_emp 
        WHERE to_date='9999-01-01') de
INNER JOIN(
    SELECT * 
    FROM salaries 
    WHERE to_date='9999-01-01') s
ON de.emp_no=s.emp_no
)a
WHERE a.rank_num=1; 


方法3)子查询
SELECT d1.dept_no, d1.emp_no, s1.salary
FROM dept_emp AS d1
INNER JOIN salaries AS s1
ON d1.emp_no=s1.emp_no
AND d1.to_date='9999-01-01'
AND s1.to_date='9999-01-01'
WHERE s1.salary IN (SELECT MAX(s2.salary)
FROM dept_emp AS d2
INNER JOIN salaries AS s2
ON d2.emp_no=s2.emp_no
AND d2.to_date='9999-01-01'
AND s2.to_date='9999-01-01'
AND d2.dept_no = d1.dept_no
)
ORDER BY d1.dept_no;
方法借鉴于网友,但个人感觉存在漏洞
  • 假设第二个最高工资表中有5000及10000两个数据,而部门d0002中员工的工资为5000,10000,会同时输出这两个员工的工资



全部评论
我想问一下为什么要把时间也要打上去,不打时间运行结果也是对的,很想知道为什么要把时间也化进来,谢谢
1 回复 分享
发布于 2022-04-10 20:23
方法三应该没有漏洞,这个是相关子查询,大概和循环的理解相似,外层每次传入部门号,内层每次查询也会筛选同一部门号,所以不会出现一个部门的最高工资和另一个部门的员工工资匹配上,导致题主所说的最高工资表产生的两个数据被同一个部门的员工匹配上了。总结就是,每次都会把本部门的最高工资找出来后(可以有多个工资),再找下一个部门的最高工资,并不是整个最高工资表直接去和总表做匹配。
点赞 回复 分享
发布于 2022-09-09 20:58 辽宁

相关推荐

点赞 评论 收藏
分享
评论
9
1
分享
牛客网
牛客企业服务