学习记录570@MySQL查询部门工资前三高的所有员工

表结构

Create table If Not Exists Employee (id int, name varchar(255), salary int, departmentId int)
Create table If Not Exists Department (id int, name varchar(255))
insert into Employee (id, name, salary, departmentId) values ('1', 'Joe', '85000', '1')
insert into Employee (id, name, salary, departmentId) values ('2', 'Henry', '80000', '2')
insert into Employee (id, name, salary, departmentId) values ('3', 'Sam', '60000', '2')
insert into Employee (id, name, salary, departmentId) values ('4', 'Max', '90000', '1')
insert into Employee (id, name, salary, departmentId) values ('5', 'Janet', '69000', '1')
insert into Employee (id, name, salary, departmentId) values ('6', 'Randy', '85000', '1')
insert into Employee (id, name, salary, departmentId) values ('7', 'Will', '70000', '1')
insert into Department (id, name) values ('1', 'IT')
insert into Department (id, name) values ('2', 'Sales')

在这里插入图片描述

思路

工资前三,可以理解为将一条记录和另外一些记录进行工资对比,如果其他记录大于本条记录的合计条数小于3,就说明大于这条记录的其他记录条数不超过3条,那么这条记录就是排名前三的,至少是第三名。

sql实现

这里用到了DISTINCT,说明并列名次是不顺延的,也就是说,如果大于本条记录的条数小于等于3,且其中有相同的分数,本条记录也可以排在前三,也就是说前三的分数中会有并列的分数存在。

SELECT
    d.Name AS 'Department', e1.Name AS 'Employee', e1.Salary
FROM
    Employee e1
        JOIN
    Department d ON e1.DepartmentId = d.Id
WHERE
    3 > (SELECT
            COUNT(DISTINCT e2.Salary)
        FROM
            Employee e2
        WHERE
            e2.Salary > e1.Salary
                AND e1.DepartmentId = e2.DepartmentId
        )

这不能归功于第六感、高超的看盘技巧或者持之以恒的勇气。这是我坚信自己的判断的报酬,与聪明或虚荣没有关系。知识就是力量,力量无须畏惧谎言,即使这个谎言通过行情显示出来,但很快就会回到正轨。


版权声明:本文为weixin_44663675原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。