letcode 185.部门工资前三高的员工

原图

我也算一个新手,所以在此我说下我的两种思路,本质上区别不大,但是执行效率相差甚远;

第一种:

题中的意思让查出前三的工资,那么我们联表进行以部门和工资排序,就可以得出所有各个部门的工资从高到低的顺序,然后我们取前三就行,如果小于3的,就全部查出来就行;

思路有了,现在就开始编写,首先设置变量 @preName 表示部门,设置变量 @preSalary 表示工资。设置变量 @rounum 表示列,用前一行的比较后一行,来查出不同工资的3列,然后返回小于等于3的列数的行就是前三的工资;

select dName AS Department, eName AS Employee, Salary FROM(select dName, eName, Salary,

@rownum := if(@preName = t.dName, @rownum + (@preSalary <> t.Salary), 1) as seq,

@preName := t.dName, @preSalary := t.Salaryfrom (

    select d.Name dName, e.Name eName, Salary from Employee e, Department d

    where e.DepartmentId = d.Id

    order by d.Name, Salary desc) t, (select @preName:=-1, @preSalary:=-1, @rownum:=0) as init) as t2where t2.seq <= 3;

第二种:

第二种和第一种本质上的思路一样,查询出同部门中的每一个工资,让单独的一列的工资与同部门其他的共i在相比较,比本身大的总数超过3就不是前三;

select d.Name Department,e.Name Employee,e.Salary Salary from Employee e inner join Department d on e.DepartmentId = d.Id where (select count(distinct c.Salary) from Employee c where e.Salary < c.Salary and e.DepartmentId = c.DepartmentId) <3 order by e.DepartmentId,e.Salary desc

如果还有其他的方法或者思路,可以评论中留言,互相学习,次啊是真的进步!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容