如果某个员工可以获得相同的薪水,则获得第二高的薪水

r3i60tvu  于 2021-06-21  发布在  Mysql
关注(0)|答案(6)|浏览(304)
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

因为它总是只显示一张唱片。
任何帮助都将不胜感激。
谢谢!!!

pw9qyyiw

pw9qyyiw1#

如果您正在使用 MySQL 8.0 或者更高版本,你可以试试 DENSE_RANK() 窗口函数,请参阅此处的文档。

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;
rjee0c15

rjee0c152#

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

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

eqoofvh93#

谢谢大家的回复。
我尝试了以下查询&它对我有效。

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

nvbavucw4#

sql查询应该是泛型的,以处理第n个最高工资。例如:从下表中,我们需要算出第三/第N高薪。在本例中,应打印b,d。

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

使用这样的查询:这里n应该是3表示第三高工资,以此类推。

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

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

snvhrwxg

snvhrwxg5#

此查询可用于:

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 |
+--------+----------+--------+
qij5mzcb

qij5mzcb6#

我倾向于使用子查询:

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() ),这似乎是最清晰的解决方案。

相关问题