心血来潮打开力扣刷了两道题感觉自己功力又衰退了这道题刚开始做自以为还是比较好做的但是很不幸自己还是想的太简单了刚开始写了个左连接然后嵌套了个查询分组后最大值最后运行完只有两个结果。然后就看到了示例里两个人工资相同的情况也要一起输出显然只查询最大工资是错误的然后就开始看评论区的解法我看见好多人都是用的窗口函数来求解的有点没理解明明可以用组合 in的方法为什么还要用上函数。select D.name as Department, E.name as Employee, E.salary as Salary from Employee E left join Department D on E.departmentId D.id where (E.departmentId,E.salary) in (select departmentId,max(salary) from Employee group by departmentId)没想到紧接着的185题就给我上了一课。本题相较于上一题只加上了一个条件就是输出排名前三的的员工信息我一开始的想法是两个表进行连接分组排序分别输出每个组别的前三个员工信息很显然又进入了上一题的误区当同部门工资相同的情况下工资前三的员工数量就不是3个人了。然后细品起上一题评论区里的窗口函数dense_rank() 这个是有序排序跟rank() 最主要的区别就是它序号的传递是相同时不会计数举个例子这里有四个数10、20、20、30dense_rank() 生成的序号为1,2,2,3rank() 生成的序号为1,2,2,4刚好可以适用于本题的解法然后去看了相关语法最后得到select d.name as Department, e.name as Employee, e.salary as Salary from (select *,dense_rank() over(partition by departmentId order by salary desc) dp from Employee) e left join Department d on e.departmentId d.id where dp 4然后又看了一个不需要窗口函数的解法题目要求输出工资前三的员工信息那么反过来想要是只有两个人比他们的工资多的话那他们肯定就是前三个之中了不得不说同学们都还是太有实力了思路很新奇欢迎大家交流学习。