2010-03-22 54 views
4

是否有任何預定義的函數或方法可用於從員工表中獲得第二高薪水?另外如何找到薪水第二高的員工?

SELECT NAME, salary 
    FROM (SELECT NAME, salary, ROWNUM r 
      FROM (SELECT NAME, salary 
        FROM employee 
       ORDER BY salary DESC 
       ) 
     WHERE ROWNUM <= :N 
     ) 
WHERE r >= :M 

,您可以使用分析:

回答

0

試試這個:

SELECT * FROM employee emp WHERE 2=(SELECT COUNT(*) FROM employee WHERE 
salary >= emp.salary); 
+0

-1我不確定這會返回什麼,但可能不是什麼問題是關於:-) – 2010-03-22 09:53:17

+0

這取決於他的意思是「方法」。 對我來說,一個方法是一個獲得結果的過程;這是我建議的方法。感謝我的第一次downvote :)。 – systempuntoout 2010-03-22 09:57:08

+3

@Aaron:或許不是最有效的方法來返回結果(因爲它使用自聯接),但它會返回正確的答案,*提供的薪水是唯一的*(如果有三個人,它將不起作用與最高工資相同)。 – 2010-03-22 10:10:08

2

在Oracle中你可以使用一個查詢,如這一個分頁的結果返回(行M到N):

SELECT NAME, salary 
    FROM (SELECT NAME, salary, row_number() over (ORDER BY salary DESC) n 
      FROM employee) 
WHERE n BETWEEN :M AND :N 
5

要做到這一點的方法是使用Oracle的分析函數。您的特定場景只是我在another thread中提供的解決方案的一個變體。

如果你有興趣只是選擇第二最高的薪水那麼任何DENSE_RANK(),RANK()和ROW_NUMBER(的)會做的伎倆:

SQL> select * from 
    2 (select sal 
    3   , rank() over (order by sal desc) as rnk 
    4  from 
    5  (select distinct sal 
    6  from emp) 
    7 ) 
    8 where rnk = 2 
    9/

     SAL  RNK 
---------- ---------- 
     3000   2 

SQL> 

但是,如果你想選擇其他信息,例如薪水第二高的員工姓名,則您選擇的功能會影響結果。選擇一個在另一個之上的主要原因是當發生平局時發生的情況。

如果您使用ROW_NUMBER()函數,它將返回按工資排序的第二名員工:如果有兩名員工爲最高工資綁定,該怎麼辦?如果有兩名員工爭取第二高的薪水呢? Wheareas如果使用RANK(),並有兩名員工爲搭售第一薪水最高,將會有沒有記錄與RANK = 2

我建議DENSE_RANK()是通常在這種情況下,選擇最安全功能,但它確實取決於具體的業務需求。

1

如果你想找到從表中N個最高的工資,你可以使用這個:

select min(sal)from (select distinct sal from emp order by sal desc) where rownum<=n; 

其中n是1,2,3,...,N

這是一個非常容易的過程,從表中找出最高工資。

相關問題