用于查找第二高薪的SQL命令

时间:2010-11-28 14:17:39

标签: sql greatest-n-per-group

HI, 你能不能告诉我SQL命令的语法,它给出了employee表中存储的工资范围中第二高的工资作为输出。 SQL commnd的描述将受到欢迎...... 请帮忙!!!

9 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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中所定义。

窗口函数通常是 awesome ,它们只是很多难以查询。

稍有不同的解决方案

这是相同的,除了当数字1为平局时返回最高薪水:

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

更新:将排名更改为dense_rank并添加了第二个解决方案。谢谢,IanC!

答案 2 :(得分: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. 按照desc顺序排序(所以第二高薪现在在顶部)
  3. 中选择前1名

    另一种方法:

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

答案 3 :(得分: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

然后跳过第一个返回的行。

答案 4 :(得分: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是强制性的(更改为RANK&你会看到)。

您还会看到为什么任何SELECT TOP 2查询都无效(无论如何都没有DISTINCT)。

答案 5 :(得分:0)

替代方案(已测试):

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

这适用于任何平台,干净,并且可以满足多个并列#1薪水的可能性。

答案 6 :(得分:0)

从empID所在的员工中选择前1 *(按工资DESC从员工订单中选择前2(empID))ORDER BY薪水ASC

说明:

按工资从员工订单中选择前2(empID)DESC将给出Salary为最高的两个记录,然后整个查询将按ASCENDING顺序对这两个记录进行排序,然后列出其中薪水最低的那个两个。

EX。让员工的工资分别为100,99,98,50。

查询1将返回sal 100和99

的人员的emp ID

整个查询将返回与薪水99相关的所有数据。

答案 7 :(得分: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()。

谢谢, 苏雷什

答案 8 :(得分:0)

更简单的方法..

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