2013-12-19 131 views
5

我需要編寫一個查詢來返回公司中第三高工資員工。SQL查詢找到公司第三高工資

我試圖用子查詢來實現這一點,但無法得到答案。我的嘗試如下:

select Max(salary) 
from employees 
where Salary not in 

(select Max(salary) 
from employees 
where Salary not in 

(select Max(salary) 
from employees)); 

我的想法是,我可以使用2個子查詢來消除第一和第二高薪水。然後,我可以簡單地選擇剩餘的工資MAX()。這是一個不錯的選擇,還是有更好的方法來實現這一目標?

+2

歡迎來到Stack Overflow!請通過添加適當的標記(Oracle,SQL Server,MySQL等)來指定您要定位的RDBMS。可能會有利用不被普遍支持的語言或產品功能的答案。此外,通過使用特定的RDBMS標記它,您的問題可能會得到更適合回答的人的關注。 – Taryn

+0

我是一個新手請sum1解釋如何限制作品,請回答我的問題有多少個子查詢鏈是允許的? –

+0

我沒有在那裏看到任何'SUM'調用。唯一的聚合是'MAX'。你是否複製了整個查詢? – billinkc

回答

-1

請注意,第三高的薪水可能與第一高的薪水相同,因此您目前的方法無效。

我會通過薪水訂購員工,並在SQL查詢結束時應用LIMIT 3。然後,你將獲得最高工資的前三名,因此,你的工資也是第三高的(如果有的話,一家公司可能有兩名員工,那麼你就沒有第三高的工資)。

14

應該在任何數據庫的工作,最簡單的方法是做如下:

SELECT * FROM `employee` ORDER BY `salary` DESC LIMIT 1 OFFSET 2; 

其中由工資訂單的員工,然後告訴DB返回一個結果(1 LIMIT)從第三排計數結果集(2在OFFSET中)。如果你的DB從1開始計數結果行而不是從0開始,它可能是OFFSET 3

這個例子應該在MySQL和PostgreSQL中工作。

+0

@KateGregory完成 –

+0

完全沒有!... – venergiac

+0

沒有任何數據庫...... –

1

某些DBMS不允許您運行多個嵌套查詢。這是一個只使用1個嵌套查詢的解決方案:

SELECT salary 
FROM 
(
    SELECT salary 
    FROM employees 
    ORDER BY salary 
    LIMIT 3 
) as TBL1 
ORDER BY salary DESC 
LIMIT 1; 

它應該給你想要的結果。它首先找到3個最大的薪水,然後選擇三個中最小的一個(或者如果他們相等,則選擇第三個)。下面是一個SQLFiddle

+0

我是新手請sum1解釋限制如何工作,請回答我的問題有多少個子查詢鏈允許? –

+0

@ user3120566您可以執行的子查詢數取決於您正在使用的DBMS。瞭解他們只會增加執行時間。上面的查詢首先找到3個最大的薪水,然後選擇三個中最小的一個(或者如果它們相等,則選擇第三個)。所以這個解決方案使用了1個子查詢。 – Joel

+0

爲什麼嵌套查詢?! –

2

您可以嘗試(如果MySQL):

SELECT salary FROM employee ORDER BY salary DESC LIMIT 2, 1; 

此查詢跳過兩行後返回一行。

您可能還想要返還不同的工資。例如,如果你有20,20,10和5,那麼5是第三高薪水。要做到這一點,添加DISTINCT上述查詢:

SELECT DISTINCT salary FROM employee ORDER BY salary DESC LIMIT 2, 1; 
+0

我是新手,請sum1解釋限制如何工作,請回答我的問題允許多少個子查詢鏈? –

+0

LIMIT 1,2表示在跳過2行之後你想要1行。 – MillaresRoo

+0

在這種情況下,您不需要子查詢。 – MillaresRoo

2

如果SQL Server這可能是工作

SELECT TOP (1) * FROM 
    (SELECT TOP (3) salary FROM employees ORDER BY salary DESC) T 
ORDER BY salary ASC 

至於你的子查詢的數量問題,去它取決於你的語言。檢查此瞭解更多信息

Is there a nesting limit for correlated subqueries in Oracle?

+0

爲什麼不使用LIMIT? –

+0

@MichaelSzyndel這是爲SQL Server不支持'LIMIT' OP沒有說明什麼語言。 – shadowjfaith

+0

我會有不良的業力,但我只是笑了。 –

3

SELECT id FROM tablename ORDER BY id DESC LIMIT 2,1

這僅僅是爲了得到第三高值。

2
SELECT Max(salary) 
FROM employee 
WHERE salary < (SELECT Max(salary) 
       FROM employee 
       WHERE salary NOT IN(SELECT Max(salary) 
             FROM employee)) 

希望這有助於你

6

你可以得到使用限制,第三高的薪水使用TOP關鍵字和子查詢

  1. TOP關鍵字

    SELECT TOP 1 salary 
    FROM 
        (SELECT TOP 3 salary 
        FROM Table_Name 
        ORDER BY salary DESC) AS Comp 
    ORDER BY salary ASC 
    
  2. 限制

    SELECT salary 
    FROM Table_Name 
    ORDER BY salary DESC 
    LIMIT 2, 1 
    
  3. 子查詢

    SELECT salary 
    FROM 
        (SELECT salary 
        FROM Table_Name 
        ORDER BY salary DESC 
        LIMIT 3) AS Comp 
    ORDER BY salary 
    LIMIT 1; 
    

我覺得這些人幫助你。

0

對我來說,在MySQL 此查詢做工精細,它將返回第三個最高年薪從表

選擇salary FROM users ORDER BY salary DESC LIMIT 1偏移2;

SELECT salary FROM users ORDER BY salary DESC LIMIT 2,1;

0
SELECT TOP 1 BILL_AMT Bill_Amt FROM (SELECT DISTINCT TOP 3 NH_BL_BILL.BILL_AMT FROM NH_BL_BILL ORDER BY BILL_AMT DESC) A 
ORDER BY BILL_AMT ASC 
0

選擇分鐘從員工(工資),其中薪水(從員工爲了薪金降序選擇前3名薪酬)

-1

你可以用這個查詢找到第三個最薪水:

SELECT min(salary) 
FROM tblEmployee 
WHERE salary IN (SELECT TOP(3) salary 
       FROM tblEmployee 
       ORDER BY salary DESC) 
0
SELECT DISTINCT MAX(salary) AS max 
FROM STAFF 
WHERE salary IN 
(SELECT salary 
FROM STAFF 
WHERE salary<(SELECT MAX(salary) AS maxima 
FROM STAFF 
WHERE salary< 
(SELECT MAX(salary) AS maxima 
    FROM STAFF)) 
GROUP BY salary); 

我嘗試過其他方式,他們是不正確的。這一個工程。

+0

這一項也起作用:選擇MAX(SALARY)作爲最大值來自工作人員的工資IN(SELECT TOP(3)[salary] FROM [STAFF] ORDER BY salary ASC) –

0

我們可以通過此查詢找到最優薪金。

WITH EMPCTE AS( SELECT E.*,DENSE_RANK()OVER(ORDER BY SALARY DESC)AS DENSERANK FROM僱員e ) SELECT * FROM EMPCTE WHERE DENSERANK = & NUM

0

SELECT * FROM employee ORDER BY salary DESC LIMIT 1 OFFSET 2;