image.png
求出部门工资前三高的员工,之前曾经解决过求排名为第N名的记录,当时用的非等值自连接或者子查询的方式,在里面通过COUNT(DISTINCT score)这样的方式统计名次,然后筛选出来。这里稍有不同,主要是这里进行了分组,可以上面的思路形成一个中间表,然后在根据where条件从中间表查数据。
下面采用另一种方式,在HAVING语句里面做筛选
SELECT d.name Department, e.Name Employee, e.Salary Salary
FROM Employee e JOIN Department d ON e.DepartmentId = d.Id
LEFT JOIN Employee e2 ON e2.Salary >= e.Salary AND e.DepartmentId = e2.DepartmentId
GROUP BY d.Id,e.Id HAVING COUNT(DISTINCT e2.Salary) <=3 ## 去重小于等于3 LEFT JOIN 条件如果加上 e2.id!= e1.id 可以小于等于2
ORDER BY d.Id ASC,Salary desc
网友评论