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

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

你可能感兴趣的:(letcode 185.部门工资前三高的员工)