Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 server 有人能解释一下下面的SQL查询是如何获得“n”最高工资的吗_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 有人能解释一下下面的SQL查询是如何获得“n”最高工资的吗

Sql server 有人能解释一下下面的SQL查询是如何获得“n”最高工资的吗,sql-server,sql-server-2005,Sql Server,Sql Server 2005,挑选* 来自雇员A 其中3=选择计数*+1 来自雇员B 其中,B.salary>A.salary 这是第三高的薪水;有人能解释一下这个查询背后的逻辑以及它是如何工作的吗。换句话说,这个查询将选择另外两个人薪水更高的员工。因此,结果是工资第三高的员工 请注意,如果有两个或两个以上的人的工资完全相同,则此查询可能会失败。换句话说,此查询将选择另外两个工资更高的人的员工。因此,结果是工资第三高的员工 请注意,如果有两个或两个以上的人拥有完全相同的工资,则此查询可能会失败。这只适用于不同的工资: 对于每

挑选* 来自雇员A 其中3=选择计数*+1 来自雇员B 其中,B.salary>A.salary


这是第三高的薪水;有人能解释一下这个查询背后的逻辑以及它是如何工作的吗。

换句话说,这个查询将选择另外两个人薪水更高的员工。因此,结果是工资第三高的员工


请注意,如果有两个或两个以上的人的工资完全相同,则此查询可能会失败。

换句话说,此查询将选择另外两个工资更高的人的员工。因此,结果是工资第三高的员工


请注意,如果有两个或两个以上的人拥有完全相同的工资,则此查询可能会失败。

这只适用于不同的工资:

对于每个员工,计算工资高于员工工资的行数。如果计数为2+1,则返回员工

因此,它将返回第三个雇员


我会使用“从选择前3名中选择前1名*从员工订单按薪资描述”按薪资排序ASC执行此操作这将仅适用于不同的薪资:

对于每个员工,计算工资高于员工工资的行数。如果计数为2+1,则返回员工

因此,它将返回第三个雇员


我会使用SELECT TOP 1 FROM SELECT TOP 3*FROM Employee ORDER BY Salary DESC a ORDER BY Salary ASC来执行此操作,这就是所谓的相关子查询。可以将其视为在外部查询中的所有记录上循环,并在where子句中对每个记录求值。这是因为where子句中的查询引用了外部查询的别名A

因此,对于中的每一位员工,都会得到高薪员工的数量

通过使用ROW_NUMBER函数,您可能可以在SQL2005和2008中更快地实现此逻辑

例如


这就是所谓的相关子查询。可以将其视为在外部查询中的所有记录上循环,并在where子句中对每个记录求值。这是因为where子句中的查询引用了外部查询的别名A

因此,对于中的每一位员工,都会得到高薪员工的数量

通过使用ROW_NUMBER函数,您可能可以在SQL2005和2008中更快地实现此逻辑

例如


为了举例说明这一点,假设工资如下;重复B的数据

EmpA EmpB

5000 5000

3000 3000

2000年2000年

1500 1500

1000 1000

500 500

在第一个解析中,A.Salary是5000,因此B中超过5000的所有Salary计数都是0。添加一个及其1。现在这将是最高的薪水。
在您的示例中,A.薪水是2000,因此B中超过2000的所有薪水计数将是2,再加上1,它将是3。加入3=3和A。将选择值为2000的薪资。

仅用一个示例说明这一点,假设薪资如下;重复B的数据

EmpA EmpB

5000 5000

3000 3000

2000年2000年

1500 1500

1000 1000

500 500

在第一个解析中,A.Salary是5000,因此B中超过5000的所有Salary计数都是0。添加一个及其1。现在这将是最高的薪水。
在您的示例中,A.薪水是2000,因此B中超过2000的所有薪水计数将是2,再加上1,它将是3。加入3=3和A。将选择值为2000的薪资。

员工A和员工B是表吗?如果是,它们包含哪些数据?否则,此查询对您试图实现的目标毫无意义。employee是表,A和B是该表的别名。您可以在[here][1]中找到解决方案,因此请遵循给定的链接。[1] :您可以在[此处][1]找到解决方案,因此请按照给定的链接进行操作。[1] :员工A和员工B是表吗?如果是,它们包含哪些数据?否则,此查询对您试图实现的目标毫无意义。employee是表,A和B是该表的别名。您可以在[here][1]中找到解决方案,因此请遵循给定的链接。[1] :您可以在[此处][1]找到解决方案,因此请按照给定的链接进行操作。[1] :+1用于注意如果薪资不唯一,查询可能会给出空结果。+1用于注意如果薪资不唯一,查询可能会给出空结果。
WITH SalaryOrder AS
(
SELECT *
   , ROW_NUMBER() OVER(ORDER BY Salary DESC) SalaryRank
FROM employee
)
SELECT * 
FROM SalaryOrder
WHERE SalaryRank = 3