HI, 你能不能告诉我SQL命令的语法,它给出了employee表中存储的工资范围中第二高的工资作为输出。 SQL commnd的描述将受到欢迎...... 请帮忙!!!
答案 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
描述:
另一种方法:
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)