我在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? 我看了一堆类似的问题,但没有人提到如何获得第二高薪的多行。
答案 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
);
答案 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