什么是一个简单的SQL查询来选择工资第二高的人的ID
如果我有亲戚:雇员ID,薪水。选择薪水第二高的人的ID的最简单的SQL查询是什么 我知道如何使用以下选项选择最高工资:什么是一个简单的SQL查询来选择工资第二高的人的ID,sql,postgresql,Sql,Postgresql,如果我有亲戚:雇员ID,薪水。选择薪水第二高的人的ID的最简单的SQL查询是什么 我知道如何使用以下选项选择最高工资: SELECT MAX(salary) FROM employee WHERE salary < (SELECT MAX(salary) FROM employee); 但您如何选择该人员的ID,并且只显示工资第二高的人员的ID而不使用限制 我会使用排号或排名,这取决于你所说的第二高工资的含义: SELECT e.* FROM (SELECT e.*, RANK() OV
SELECT MAX(salary)
FROM employee
WHERE salary < (SELECT MAX(salary)
FROM employee);
但您如何选择该人员的ID,并且只显示工资第二高的人员的ID而不使用限制 我会使用排号或排名,这取决于你所说的第二高工资的含义:
SELECT e.*
FROM (SELECT e.*, RANK() OVER (ORDER BY salary DESC) as seqnum
FROM employee e
) e
WHERE seqnum = 2;
如果您想使用您的查询(这似乎更复杂),您可以使用子查询:
SELECT e.*
FROM employee e
WHERE e.salary = (SELECT MAX(e2.salary)
FROM employee e2
WHERE e2.salary < (SELECT MAX(e3.salary)
FROM employee e3
)
);
很高兴看到SQL在过去30年中取得了一些进步。我会使用row_编号或排名,这取决于您所说的第二高工资的含义:
SELECT e.*
FROM (SELECT e.*, RANK() OVER (ORDER BY salary DESC) as seqnum
FROM employee e
) e
WHERE seqnum = 2;
SELECT *
FROM employee
WHERE salary = (
SELECT max(salary)
FROM employee
WHERE salary != (
SELECT max(salary)
FROM employee
)
);
如果您想使用您的查询(这似乎更复杂),您可以使用子查询:
SELECT e.*
FROM employee e
WHERE e.salary = (SELECT MAX(e2.salary)
FROM employee e2
WHERE e2.salary < (SELECT MAX(e3.salary)
FROM employee e3
)
);
很高兴看到SQL在过去30年中取得了一些进展
SELECT *
FROM employee
WHERE salary = (
SELECT max(salary)
FROM employee
WHERE salary != (
SELECT max(salary)
FROM employee
)
);
这将为您提供工资第二高的所有员工的ID。如果您只需要一名员工,请在外部查询中使用SELECT MINID
这将为您提供工资第二高的所有员工的ID。如果您只需要一名员工,请在外部查询中使用SELECT MINID。最佳答案取决于是否存在薪资索引。我已经设置了一个在一个表中加载10万行的程序 有了索引,我的答案是:
SELECT * FROM employee ORDER BY salary DESC LIMIT 1 OFFSET 1;
这是最简单、最短、最干净的。它也是最快的,速度为40µs,因为它向后使用索引扫描。但是,如果第二个位置有接头,它将只返回一行
尽管有一个索引,上面三个子查询中包含max的查询仍然是紧随其后的第二个查询。Bob Jarvis的分数为100µs
不幸的是,Gordon的窗口函数遇到了一个障碍,因为postgres很好地扫描了整个索引,至少它没有进行排序:
Subquery Scan on e (cost=0.29..7518.27 rows=500 width=20) (actual time=0.042..137.810 rows=1 loops=1)
Filter: (e.seqnum = 2)
Rows Removed by Filter: 99999
-> WindowAgg (cost=0.29..6268.27 rows=100000 width=20) (actual time=0.029..121.445 rows=100000 loops=1)
-> Index Scan Backward using emps_sal on employee e_1 (cost=0.29..4768.27 rows=100000 width=12)
(actual time=0.022..54.861 rows=100000 loops=1)
这需要137ms,相当长。我认为根本原因是postgres将seqnum=2视为任何其他WHERE表达式,因此没有意识到它可能在第二行之后停止。我们可以通过添加限制1来推动它,在这种情况下,它会在第二行之后停止,只需要70µs,因此速度非常快
现在,没有索引
我对ORDER BY的查询进行了排序,但它是postgres辉煌的top-n堆,速度很快:34毫秒
Gordon的窗口函数进行完整排序,需要108毫秒
Bob的查询没有排序,但它扫描了表3次:84毫秒。最佳答案取决于是否存在薪资指数。我已经设置了一个在一个表中加载10万行的程序 有了索引,我的答案是:
SELECT * FROM employee ORDER BY salary DESC LIMIT 1 OFFSET 1;
这是最简单、最短、最干净的。它也是最快的,速度为40µs,因为它向后使用索引扫描。但是,如果第二个位置有接头,它将只返回一行
尽管有一个索引,上面三个子查询中包含max的查询仍然是紧随其后的第二个查询。Bob Jarvis的分数为100µs
不幸的是,Gordon的窗口函数遇到了一个障碍,因为postgres很好地扫描了整个索引,至少它没有进行排序:
Subquery Scan on e (cost=0.29..7518.27 rows=500 width=20) (actual time=0.042..137.810 rows=1 loops=1)
Filter: (e.seqnum = 2)
Rows Removed by Filter: 99999
-> WindowAgg (cost=0.29..6268.27 rows=100000 width=20) (actual time=0.029..121.445 rows=100000 loops=1)
-> Index Scan Backward using emps_sal on employee e_1 (cost=0.29..4768.27 rows=100000 width=12)
(actual time=0.022..54.861 rows=100000 loops=1)
这需要137ms,相当长。我认为根本原因是postgres将seqnum=2视为任何其他WHERE表达式,因此没有意识到它可能在第二行之后停止。我们可以通过添加限制1来推动它,在这种情况下,它会在第二行之后停止,只需要70µs,因此速度非常快
现在,没有索引
我对ORDER BY的查询进行了排序,但它是postgres辉煌的top-n堆,速度很快:34毫秒
Gordon的窗口函数进行完整排序,需要108毫秒
Bob的查询没有排序,但它扫描了表3次:84毫秒。psql通常与Postgres关联,因此我添加了标记。psql通常与Postgres关联,因此我添加了标记。中国人没有帮助回答这个问题。你可能想用英语重新表述。但我的英语不熟悉,只能用谷歌翻译。那可能没关系。在只有英语的网站上使用中文是不合适的。好吧,这是我的错。这个╮ ╯ ▽ ╰ ╭. . 中国人没有帮助回答这个问题。你可能想用英语重新表述。但我的英语不熟悉,只能用谷歌翻译。那可能没关系。在只有英语的网站上使用中文是不合适的。好吧,这是我的错。这个╮ ╯ ▽ ╰ ╭