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
因为它总是只显示一条记录。
任何帮助都将不胜感激。
感谢!!!
答案 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()
),这似乎是最清晰的解决方案。