2010-11-28 60 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)