如何在mysql中获得第二高的受薪员工

时间:2016-03-19 05:17:14

标签: mysql

我在MySQL中有一个员工表,其中包含以下条目。我需要找到所有薪水第二高的员工。在这种情况下,它将是c和d。

id | name | salary
 1 |    a | 1000
 2 |    b | 1000
 3 |    c |  500
 4 |    d |  500
 5 |    e |  400

我尝试在查询

下运行
SELECT name, MAX(salary) FROM employee WHERE salary < (SELECT MAX(salary) from employee);

但是这个查询只返回c作为结果。如何获得结果中的c和d? 我看了一堆类似的问题,但没有人提到如何获得第二高薪的多行。

10 个答案:

答案 0 :(得分:2)

你可以找到第二高薪:

SELECT salary 
FROM employee
GROUP BY salary
ORDER BY salary DESC
LIMIT 1, 1

然后将结果提供给同一事务中的另一个查询:

SELECT *
FROM employee
WHERE salary = ?

或者作为子查询来做:

SELECT *
FROM employee
WHERE salary = (
    SELECT salary 
    FROM employee
    GROUP BY salary
    ORDER BY salary DESC
    LIMIT 1, 1
)

答案 1 :(得分:2)

如果您想迁移到MSSQL Server:)。

SELECT * FROM (
SELECT MAX(salary) T,RANK() OVER (ORDER BY SALARY DESC) AS RankBySalary FROM Employees
GROUP BY SALARY ) TB 
WHERE RankBySalary = 3

或者更好:

SELECT * FROM 
(
SELECT ID,NAME,SALARY,DENSE_RANK() OVER (ORDER BY SALARY DESC) AS RankBySalary FROM employee
)
TB  WHERE RankBySalary = 2

答案 2 :(得分:2)

您可以从表中获得第二高的工资

SELECT MAX(salary) FROM Employee WHERE Salary NOT IN ( SELECT Max(Salary) FROM Employee);

答案 3 :(得分:1)

   SELECT *
   FROM employee one1
   WHERE ( N ) = (
           SELECT COUNT( one2.salary )
           FROM employee one2
           WHERE one2.salary > one1.salary
        )
  

注意:N表示第N个最高薪水

<强> Demo

答案 4 :(得分:1)

首先找到第二高的工资金额,然后选择具有该工资的行。

<强>查询

select * from Employees 
where Salary = (
  select min(t.salary) from (
  select salary
  from Employees
  group by salary
  order by salary desc limit 2
  )t
);

SQL Fiddle demo

答案 5 :(得分:1)

我建议你必须先选择第二高的薪水,然后在原始表格上使用带JOIN的派生表。像这样:

SELECT
  original_record.*
FROM
salary_record AS original_record
JOIN
(SELECT
  distinct salary
 FROM
  salary_record
 ORDER BY 1
 LIMIT 1,1
) AS derived_record
ON
 original_record.salary = derived_record.salary

PS:我已将您的employee表重命名为salary_record

另请参阅Varoon Sahgal关于 Nth最高薪水的文章,其中:http://www.programmerinterview.com/index.php/database-sql/find-nth-highest-salary-sql/。本文的评论部分以及文章本身都有一些优化的例子。

答案 6 :(得分:1)

select name,max(salary) from employee x where (n-1)=(select count(distinct salary)from employee y where x.salary<y.salary);

Nth max salary

答案 7 :(得分:1)

    -- IF THIS TABLE EXISTS, DROP IT
    DROP TABLE E2;      



    -- THE FOLLOWING CTE ARRANGES SALARIES IN DECENDING ORDER
    WITH copytable(Salary) AS
    (
        SELECT Emp1.Salary
        FROM Employees AS Emp1, Employees AS Emp2
        WHERE Emp1.Salary > Emp2.salary 
        GROUP BY Emp1.Salary
    ) 
    --  COPY THE CTE IN A TABLE 
    SELECT * INTO E2 FROM copytable     

    -- GIVES THE RANK TO THE SALARY IN DECENDING ORDER
    ALTER TABLE E2
    ADD  RankOfSalary INT IDENTITY(1, 1)    

    -- TO GET THE LOWEST RANK WHICH WILL BE THE HIGHEST SALARY
    DECLARE @rankOfSalary int;
    SELECT @rankOfSalary = COUNT(Salary) from E2; 

    --  SELECTING THE SECOND LARGEST SALARY
    DECLARE @SelectSalary INT
    SELECT @SelectSalary =  Salary from E2 where RankOfSalary = @rankOfSalary - 1;  

这就是你如何在没有使用max(),order by,top in sql server的情况下完成的 在不使用max(),order by,top in sql server

的情况下选择员工的第二大薪水

只是想发布这个:p

答案 8 :(得分:0)

尝试这一点同时获得c和d

SELECT 
  name, salary
FROM
  employee
WHERE salary = (
    SELECT salary
    FROM employee
    GROUP BY salary
    ORDER BY salary DESC
    LIMIT 1,1
);

答案 9 :(得分:0)

你可以通过这个得到它:

第二大薪水:

SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM employees))

第三大薪水:

SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM employees)))


有用的链接:
http://www.mysqltutorial.org/select-nth-highest-record-database-table-using-mysql.aspx http://www.programmerinterview.com/index.php/database-sql/find-nth-highest-salary-sql/ http://www.coderanch.com/t/530503/JDBC/databases/select-Nth-highest-salary-table