2011-07-21 42 views
0

如何從下表中獲取每個deptno秒薪水最高?獲得第二高的薪水從每個DEPTNO

ID NAME      AGE  DEPTNO  SALARY 
-- -------------------- ---------- ---------- ---------- 
1 shasank      25   11  2025 
2 raju       27   12  2027 
3 son       33   12  2131 
6 bali       31   10  2031 
4 rambo      34   11  2345 
5 don       32   11  2132 
7 dimpu      31   12  2121 
8 rahul      28   10  2341 
9 janny      28   10  2123 
+0

什麼RDBMS您使用的? – gbn

+0

HE標記了sql。因此,它明確 –

+0

@Jatin Dhoot:解決方案SQL Server 2005將是不同的MySQL的... – gbn

回答

0

首先檢索頂部2個記錄,然後創建一個表的別名,然後遞減

0

檢索記錄順序嘗試這個
SELECT TOP 2 FROM '表名' 限價1,1順序按降序

+0

這是什麼引擎? – gbn

3

如果您使用支持SQL排名函數的系統,那麼DENSE_RANK可能就是您正在尋找的內容。下面是SQL Server 2005或更高版本:

SELECT 
    * --TODO - pick columns 
FROM 
    (
     SELECT *,DENSE_RANK() OVER (PARTITION BY DeptNo ORDER BY Salary DESC) as Rnk 
     FROM Table 
    ) 
WHERE 
    Rnk = 2 

SQL Server documentation on DENSE_RANK

+0

如果只有一個deptno,這不會失敗嗎?比如說,在上面的例子中,有一個只有一行的deptno 9。您的查詢將跳過它作爲「rnk = 2」。 – 6055

+0

@ 6055 - **如果**您的數據包含此類可能性,那麼您需要定義在這種情況下「第二高薪」將意味着什麼。該解決方案不*失敗*。您的評論似乎假設行應該仍然存在(但並不意味着結果應該是什麼),但這不是問題中指定的要求。 –

0

嘗試此查詢

SELECT * FROM( SELECT *,ROW_NUMBER()OVER(ORDER BY工資DESC)作爲行FROM )一個WHERE行> 1個行< = 2

+0

我知道這是一個古老的答案,但是'WHERE'子句必須是表達'row = 2'的最糟糕的方式之一,我曾遇到過。 (我被我的回答評論喚醒) –