2016-12-05 73 views
-1

我嘗試從頂部5名員工獲得所有3最高的薪水這樣第三高的薪水SQL

salary 
    35000 
    34000 
    20000 
    12000 
    500 
    40000 
    25000 
    41000 
    90000 
    550000 

查詢

select top 5 
    (SELECT MAX(grosssalary) FROM Detail) maxsalary , 
    (SELECT MAX(grosssalary) FROM Detail) sec_max_salary, 
    (SELECT MAX(grosssalary) FROM Detail 
    WHERE grosssalary NOT IN (SELECT MAX(grosssalary) FROM Detail)) as third_max_salary 

但這樣表示

maxsalary sec_max_salary third_max_salary 
550000  550000   41000 

,其中數據因爲我想要這樣的數據

maxsalary sec_max_salary third_max_salary 
    550000  90000   41000 
+4

可能的重複:http://stackoverflow.com/questions/16234983/how-to-find-third-or-nth-maximum-salary-from -salary- – thebenman

+0

可以檢查我的答案@superuser – Chanukya

+0

http://stackoverflow.com/q/16234983/3261852 – Munavvar

回答

1

做一個CTE並獲得salary DESCROWNUMBER()和外部查詢獲取與ROWNUMBER等於記錄3

;WITH CTE AS 
(
    SELECT RN = ROW_NUMBER() OVER (ORDER BY salary DESC), 
      Salary 
    FROM [YourTable] 
) 

SELECT Salary 
FROM CTE 
WHERE RN <= 3 

注:如果你想第三高的薪水使用RN=3如果你希望所有頂部3薪水然後用RN<=3

如果你想前3名的薪水最高,那麼你可以這樣做,以及:

SELECT TOP 3 Salary 
FROM [YourTable] 
ORDER BY Salary DESC 
+0

的副本什麼是CTE?這是複雜的查詢請根據我的查詢 –

+1

@superuser修改這將給你前3名的薪水,但他們仍然可以都是相同的薪水。如果你正在尋找前3名不同的薪水,那麼你所需要做的就是將ROW_NUMBER()轉換爲DENSE_RANK()。另外請注意使用PIVOT這個輸出會讓你很好的3行而不是行。 – Matt

0

使用DENSE_RANK()訂購工資,然後使用CASE表達式查找前3名工資。

查詢

;with cte as(
    select [sal_rank] = dense_rank() over(
     order by [grosssalary] desc 
    ), * 
    from [your_table_name] 
) 
select max(case [sal_rank] when 1 then [grosssalary] end) as [maxsalary], 
max(case [sal_rank] when 2 then [grosssalary] end) as [sec_max_salary], 
max(case [sal_rank] when 3 then [grosssalary] end) as [third_max_salary] 
from cte; 
+0

什麼是cte ?????? –

+0

@superuser:[Common Table Expression](https://msdn.microsoft.com/en-IN/library/ms175972.aspx) – Wanderer

+0

RANK()在這裏可能會有問題,因爲如果兩個人共享最高薪水,它將排名第一1 3所以你第二個最高工資將是NULL。如果你想允許這樣的關係,DENSE_RANK()會更好,但條件聚合對於OP – Matt

1
CREATE TABLE #A 
(

salary INT 
) 
INSERT INTO #A VALUES 
    (35000), 
    (34000), 
    (20000), 
    (12000), 
    (500 ), 
    (40000), 
    (25000), 
    (41000), 
    (90000), 
    (550000) 


select [1] maxsalary, [2] sec_max_salary, [3] third_max_salary 
from (
SELECT * 
FROM (

    SELECT *, 
      RN = ROW_NUMBER() OVER (ORDER BY Salary DESC) 
    FROM #A 
)a 
WHERE RN <= 3 

) src 
pivot 
(
    MAX(SALARY) 
    for RN in ([1], [2], [3]) 
) piv; 

輸出

maxsalary sec_max_salary third_max_salary 
550000  90000   41000 
0

如果您正在使用SQL SERVER 2012+然後用OFFSET

SELECT TOP 1 salary, 
      (SELECT salary FROM Yourtable 
       ORDER BY salary DESC OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY), 
      (SELECT salary FROM Yourtable 
       ORDER BY salary DESC OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY) 
FROM Yourtable 
ORDER BY salary DESC 

如果您想只是第三高的薪水,然後

SELECT salary 
FROM yourtable 
ORDER BY salary DESC 
OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY 
-2
select * 
from 
(select * 
    from table 
    order by salary desc 
    limit 3 
) as top_three 
order by top_three.salary asc 
limit 1 
+1

sql-server使用SELECT TOP不限制 – Matt

0

下面的代碼會導致你得到第N最大或最小的薪水值不考慮到數據類型,即。整數或Vearchar。 只需更改'<'符號以獲取更小的第n個值。

select * from txt_salary as t1 where 'nth largest' = 
(select count(salary) from txt_salary as t2 where t1.salary<=t2.salary) 
0

對於SQL SERVER

SELECT E1。* FROM emp E1 WHERE e1.salary = ( 選擇MIN(e2.salary) 從(選擇頂部3 DISTINCT(E3。薪水)從emp如通過e3.salary降序E3 ORDER)爲E2 )

對於MySQL

SELECT e1。* FROM emp E1 WHERE e1.salary = ( 選擇MIN(e2.salary) 從(由e3.salary降序極限0,3)爲E2從emp選擇DISTINCT(e3.salary)作爲E3 ORDER )

0

選擇最大值(工資),如從僱員
UNION
選擇最大值(工資)最高爲從僱員2nd_highest其中薪水<(選擇最大(從僱員薪水))
UNION
最大值(工資),如從僱員3rd_highest其中工資<(選擇員工最大(工資)的地方Ý<(選擇最大(從僱員薪水)))=

對於第十八最高薪水=
選擇工資,ENAME,EID FROM(選擇e.ename,e.salary,e.eid,秩() OVER(按e.eid desc排序)等級)WHERE等級= 18

相關問題