Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是一个简单的SQL查询来选择工资第二高的人的ID_Sql_Postgresql - Fatal编程技术网

什么是一个简单的SQL查询来选择工资第二高的人的ID

什么是一个简单的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

如果我有亲戚:雇员ID,薪水。选择薪水第二高的人的ID的最简单的SQL查询是什么

我知道如何使用以下选项选择最高工资:

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关联,因此我添加了标记。中国人没有帮助回答这个问题。你可能想用英语重新表述。但我的英语不熟悉,只能用谷歌翻译。那可能没关系。在只有英语的网站上使用中文是不合适的。好吧,这是我的错。这个╮ ╯ ▽ ╰ ╭. . 中国人没有帮助回答这个问题。你可能想用英语重新表述。但我的英语不熟悉,只能用谷歌翻译。那可能没关系。在只有英语的网站上使用中文是不合适的。好吧,这是我的错。这个╮ ╯ ▽ ╰ ╭