2011-05-04 88 views

回答

13

引用在SQL Server 2005和了,你可以使用的排名功能之一來實現這一目標:

;WITH RankingEmployees AS 
(
    SELECT 
     EmpID, 
     DENSE_RANK() OVER(ORDER BY Salary DESC) 'SalaryRank' 
    FROM dbo.Employees 
) 
SELECT 
    * 
FROM 
    RankingEmployees 
WHERE 
    SalaryRank = 5 

使用DENSE_RANK將給予同樣的薪水的所有僱員相同的等級,例如你會得到第五高的薪水和所有有這個薪水的員工。

+0

再次感謝這個答案..順便說一句,我在哪裏可以學到更多的cte查詢..? – 2012-05-05 11:23:11

+1

在線瀏覽MSDN Books - 這是完整的SQL Server文檔 - 任何人都可以在線免費閱讀!見例如[使用通用表格表達式](http://msdn.microsoft.com/en-us/library/ms190766.aspx) - 或者僅僅是Google for「CTE」 – 2012-05-05 11:25:50

-1
DECLARE @result bigint 

SELECT TOP 5 @result = EmpID 
FROM Employees 
ORDER BY Salary DESC 

SELECT @result 
+0

這可能只會找到第五個'EmpId',但是(1)不能保證(2)反正這不是問題中的要求。 – 2011-09-18 15:56:50

0
SELECT * 
FROM (Select * From Employee Order By salary Desc) 
WHERE ROWNUM <= 5; 

內部查詢即Select * From Employee Order By salary Desc將從Employee表返回所有員工,由Salary列排序DESCENDING

通過使用rownum,我們可以過濾前5條記錄。

好吧,我得到了你的qns wrong.Well下面的查詢將工作。

選擇* 從 (選擇ENAME,SAL, DENSE_RANK()OVER(ORDER BY SAL降序),爲秩 從EMP) 其中秩爲了通過秩;

+0

Dud現在我的問題引發了第一個結果集中的ROWNUM?例如,第五最高薪水爲10K,而有25個僱員的薪水爲1k,因此需要這個問題中的所有25個記錄。 – 2013-06-06 13:31:43

+0

還有沒有任何內部關鍵字的RUMMS在** MS SQL **中提到[這裏](http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/f01b163a-7f91-4e05 -873d-277c7a1b066e) – 2013-06-06 13:38:35

+0

我收到了您的問題。查詢將選擇*來自(選擇ename,sal,dense_rank()over(按sal desc排序)作爲等級來自emp)其中等級<= 5等級排序; – 2013-08-13 13:05:19

0

試試這樣說:

SELECT * 
    FROM EMPLOYEE AS EMP1 
    WHERE 4 = 
     (
     SELECT count(Distint(EMP2.SALARY) 
     FROM EMPLOYEE AS EMP2 
      WHERE EMP2.SALARY> EMP1.SALARY 
    ) 
+0

甚至在語法上也不正確,請檢查括號。 – 2013-06-19 10:13:15

1

這可以使用子查詢也可以做到了。下面的SQL查詢做相同的工作

SELECT TOP 1 SALARY 
FROM (
     SELECT DISTINCT TOP 5 SALARY 
     FROM EMPLOYEES 
     ORDER BY SALARY DESC 
    ) RESULT 
ORDER BY SALARY 

你可以找到差不多的更多細節在我的博客How to find nth highest salary using SQL query

此外,它可以通過CTE來實現,並使用DENSE_RANK()

WITH RESULT AS 
(
    SELECT SALARY, 
      DENSE_RANK() OVER (ORDER BY SALARY DESC) AS DENSERANK 
    FROM EMPLOYEES 
) 
SELECT TOP 1 SALARY 
FROM RESULT 
WHERE DENSERANK = N 

剛用你需要找到的最高薪水代替N。

+0

您提交的兩個查詢會給出完全不同的結果。另外,密集排名查詢與@ marc提供的重複(相同),並且第一個查詢不會按照我的預期給出結果。我希望所有第五高的員工,無論是1或10個所有員工的記錄.. – 2015-12-21 09:26:09