2016-06-11 98 views
2

我需要以最有效的方式获取第三高薪水的员工的所有详细信息。获得第三高薪水的员工

我的查询:

select(SELECT MIN(Salary) 
FROM (SELECT * TOP (3) Salary 
     FROM Employees 
     ORDER BY Salary) 

有没有在我的query.how我可以纠正我query.Please帮助的任何问题。

回答

1

您可以使用Rownumber:在这里,我通过EMPID分割,以避免关系

;With cte 
as 
(
select *,row_number() over (partition by empid order by salary desc) as rownum 
from 
table 
) 
select * from cte where rownum=3 
如果你想用你的查询

SELECT MIN(Salary 
FROM (
SELECT TOP (3) Salary 
     FROM Employees 
     ORDER BY Salary 
)b 
+0

非常感谢,无论如何,我是否可以改变我目前的查询来解决我的问题? – youv

2

使用RANK

; WITH T AS 
(
    SELECT * , RANK() OVER (ORDER BY SalaryDESC) as rk 
    FROM Employees 
)  
Select TOP(1) * 
FROM T 
WHERE T.rk=3 
+0

密集排名不会帮助,如果薪水相等,你将不得不根据一个独特的列分区 – TheGameiswar

+0

我知道这一点。如果你需要你不能使用'RANK()' –

1

有几种方法可以去做回合做这个。两种可能的方法是

  • 使用row_number(或其他窗口的功能,如rankdense_rank
  • 上的子查询使用top,然后subsequntly对结果集

我建议使用row_number,因为那需要更多的CPU,而使用上述两种方法中的后者。

以下是两者的测试用例,显示的是子查询方法在不到四分之一的时间内运行。

create table #Salary (
    PersonId int identity(1, 1) primary key clustered, 
    SalaryAmt decimal(16, 2) not null); 

/* Insert some test data ... */ 
insert #Salary (
    SalaryAmt) 
select top (10000000) 
    abs(checksum(newid()) % 1000000) 
from sys.all_columns a 
cross join sys.all_columns b 

set statistics io on; 
set statistics time on; 

select * 
from (
    select *, 
     RowNum = row_number() over (order by SalaryAmt desc) 
    from #Salary) a 
where RowNum = 3; 

set statistics time off; 
set statistics io off; 

checkpoint; 
go 
dbcc dropcleanbuffers; 
go 

set statistics io on; 
set statistics time on; 

select top 1 * 
from (
    select top 3 * 
    from #Salary 
    order by SalaryAmt desc) top_3 
order by SalaryAmt; 

set statistics time off; 
set statistics io off; 

结果如下:

 
SQL Server parse and compile time: 
    CPU time = 0 ms, elapsed time = 1 ms. 
PersonId SalaryAmt        RowNum 
----------- --------------------------------------- -------------------- 
1427822  999999.00        3 

Table '#Salary_____________________________________________________________________________________________________________000000000007'. Scan count 9, logical reads 27219, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 


SQL Server Execution Times: 
    CPU time = 17123 ms, elapsed time = 2361 ms. 
DBCC execution completed. If DBCC printed error messages, contact your system administrator. 
SQL Server parse and compile time: 
    CPU time = 0 ms, elapsed time = 0 ms. 
PersonId SalaryAmt 
----------- --------------------------------------- 
1427822  999999.00 

Table '#Salary_____________________________________________________________________________________________________________000000000007'. Scan count 9, logical reads 27219, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 


SQL Server Execution Times: 
    CPU time = 4282 ms, elapsed time = 570 ms. 

希望这有助于。

相关问题