如果某个员工能够获得相同的工资,那么获得第

时间:2018-04-29 08:19:49

标签: mysql sql

employee Table;

+--------+------------------+
| emp_id | emp_name  salary |
+--------+----------+--------+
| 1      | James    |  2000  |
| 2      | Jack     |   4000 |
| 3      | Henry    |   6000 |
| 5      | John     |   8000 |
| 6      | Martin   |   6000 |`
| 7      | Deny     |   6000 |

我希望得到第二高薪&根据表格第二高的薪水将是: -

+--------+------------------+
| emp_id | emp_name  salary |
+--------+----------+--------+
| 3      | Henry    |   6000 |
| 6      | Martin   |   6000 |`
| 7      | Deny     |   6000 |

我怎么能做到这一点?

我无法使用: -

select * from employee order by salary desc Limit 1,1

因为它总是只显示一条记录。

任何帮助都将不胜感激。

感谢!!!

6 个答案:

答案 0 :(得分:2)

可以使用此查询:

select * from employee where salary =
(select max(salary) from employee where salary <
(select max(salary) from employee));

对于数据集,结果如下:

+--------+----------+--------+
| emp_id | emp_name | salary |
+--------+----------+--------+
|      3 | Henry    |   6000 |
|      6 | Martin   |   6000 |
|      7 | Deny     |   6000 |
+--------+----------+--------+

答案 1 :(得分:0)

您可以在内联子查询(括号中的查询)中选择紧邻最大值,然后根据它返回的结果运行select查询:

select `emp_id`, `emp_name`, `salary` from employee where `salary` = (select `salary` from employee where `salary` < MAX(salary) order by salary desc limit 1);

答案 2 :(得分:0)

SQL查询应该是通用的,以处理第N个最高薪水。 例如:从下表中,我们需要计算出第3 /第N个最高薪水。在此示例b中,应打印d。

Empname    Salary
A           400
B           200
C           100
D           200
E           300

使用这样的查询:这里N应该是3,表示第3个最高薪水,依此类推。

SELECT *
FROM Employee Emp1
WHERE (N-1) = ( 
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2 WHERE Emp2.Salary > Emp1.Salary)

我希望这个通用查询有所帮助。

答案 3 :(得分:0)

如果您使用的是MySQL 8.0或更高版本,则可以尝试DENSE_RANK()窗口功能,请参阅文档here

SELECT * FROM
(
    SELECT
        e.*,
        DENSE_RANK() OVER w AS 'rank'
    FROM
        employee e
    WINDOW w AS (ORDER BY e.salary DESC)
) a

WHERE a.rank = 2;

答案 4 :(得分:0)

感谢大家的回复。

我尝试了以下查询&amp;它对我有用。

select * from employee where salary=(select salary from employee order by salary desc limit 1,1)

答案 5 :(得分:0)

我倾向于使用子查询来解决这个问题:

select e.*
from employee e
where e.salary = (select distinct e2.salary
                  from employee e2
                  order by e2.salary desc
                  limit 1 offset 1
                 );

子查询也可以移动到from子句,因为它不相关。它只是对所有不同的工资进行排序,并使用limit / offset来获得第二个工资。不使用窗口函数(即dense_rank()),这似乎是最清晰的解决方案。