2010-11-28 61 views
0

HI, 可以告訴我SQL命令的語法,該命令以員工表中存儲的一系列薪金作爲輸出提供第二高薪水。 SQL commnd的說明將受歡迎... 請幫忙!!!用於查找第二高薪水的SQL命令

+1

的可能重複[SQL查詢來發現從工資表第n個最高工資(http://stackoverflow.com/questions/3850034/sql-query-to-find-n-highest-salary-from-salary-table) – LittleBobbyTables 2010-11-28 14:23:58

+0

另一個問題及其答案是針對SQL Server等的。所以這裏的答案是TOP – fredt 2010-11-28 14:49:11

回答

1
with tempTable as(
    select top 2 max(salary) as MaxSalary from employee order by salary desc 
) select top 1 MaxSalary from tempTable 

描述:

  1. 選擇頂部2最大薪金
  2. 爲了他們通過遞減順序(因此第二最高薪水現在是在頂部)
  3. 從選擇頂部1

另一種方法:

select top 1 MaxSalary from (
    select top 2 max(salary) as MaxSalary from employee order by salary desc 
) 
+1

這是行不通的。 max()函數將只返回1個結果。 – IamIC 2010-11-28 17:44:05

+0

請先試試吧 – 2010-11-28 17:52:39

+0

我測試過了......聚合函數只返回一條記錄。 :) – IamIC 2010-11-28 17:54:49

6
select min(salary) from 
(select top 2 salary from SalariesTable order by salary desc) 
as ax 
0

您沒有指定您正在使用的實際SQL產品,並且查詢語言因產品而異。然而,這樣的事情應該讓你開始:

SELECT salary FROM employees E1 
    WHERE 1 = (SELECT COUNT(*) FROM employee E2 WHERE E2.salary > E1.salary) 

(感謝fredt的更正)。

或者(和更快的在性能方面)會

SELECT TOP 2 salary FROM employees ORDER BY salary DESC 

,然後跳過第一個返回的行。

5

這應該工作:

select * from (
select t.*, dense_rank() over (order by salary desc) rnk from employee t 
) a 
where rnk = 2; 

這將返回第二高的薪水。

dense_rank() over是一個窗口函數,它給你指定集合內特定行的等級。它的標準SQL,如SQL:2003中所定義。

窗口函數是真棒一般來說,他們簡單地解決了很多困難的查詢。

稍有不同的溶液

這是相同,除了返回薪水最高時,有一個並列號1:

select * from (
select t.*, row_number() over (order by salary desc) rnk from employee t 
) a 
where rnk = 2; 

更新:變更秩DENSE_RANK和添加的第二可解。謝謝,IanC!

0

下面是一些示例代碼,以概念證明:

declare @t table (
    Salary int 
) 

insert into @t values (100) 
insert into @t values (900) 
insert into @t values (900) 
insert into @t values (400) 
insert into @t values (300) 
insert into @t values (200) 

;WITH tbl AS (
    select t.Salary, DENSE_RANK() OVER (order by t.Salary DESC) AS Rnk 
    from @t AS t 
) 
SELECT * 
FROM tbl 
WHERE Rnk = 2 

DENSE_RANK是強制性的(其他城市排名&你會看到)。

你還會明白爲什麼任何SELECT TOP 2查詢都不起作用(無論如何都沒有DISTINCT)。

0

一種替代(測試):

select Min(Salary) from (
    select distinct TOP (2) salary from employees order by salary DESC) AS T 

這將在任何平臺上工作,是乾淨的,並且迎合多個並列#1薪金的可能性。

0

選擇頂部1 *從僱員其中EMPID在(由薪金DESC從僱員順序選擇頂部2(EMPID))ORDER BY薪金ASC

說明:

選擇頂部2(EMPID)從僱員順序根據薪水,DESC將給出薪水最高的兩個記錄,然後整個查詢將按升序排列這兩個記錄,然後列出兩個中薪水最低的記錄。

EX。讓員工的薪水爲100,99,98,50。

查詢1將返回的人的EMP ID用Sal 100和99

所有查詢將返回與具有人薪水99.

0
SELECT Salary,EmpName 
FROM 
    (
    SELECT Salary,EmpName,ROW_NUMBER() OVER(ORDER BY Salary) As Rank 
    FROM EMPLOYEE 
    ) A 
    WHERE A.Rank=n; 

的所有數據,其中n是數請求表格的最高工資。Ucan也可以使用DenseRank()函數代替ROW_NUMBER()。

感謝, 蘇雷什

0

一個簡單的方法..

select MAX(salary) as SecondMax from test where salary !=(select MAX(salary) from test)