Sql 第二高薪
编写SQL查询以从Employee表中获取第二高的薪资Sql 第二高薪,sql,sql-server,sql-server-2008,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2012,编写SQL查询以从Employee表中获取第二高的薪资 | Id | Salary | | 1 | 100 | | 2 | 200 | | 3 | 300 | 例如,给定上述Employee表,查询应返回200作为第二高工资。如果没有第二高工资,则查询应返回null | SecondHighestSalary | | 200 | 这是Leetcode提出的问题,我为此输入了以下代码:
| Id | Salary |
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
例如,给定上述Employee表,查询应返回200作为第二高工资。如果没有第二高工资,则查询应返回null
| SecondHighestSalary |
| 200 |
这是Leetcode提出的问题,我为此输入了以下代码:
SELECT CASE WHEN Salary = ''
THEN NULL
ELSE Salary
END AS SecondHighestSalary
FROM (SELECT TOP 2 Salary
,ROW_NUMBER() OVER (ORDER BY Salary DESC) AS Num
FROM Employee
ORDER BY Salary DESC) AS T
WHERE T.Num = 2
它表示,如果没有第二高工资的值,则查询不会返回NULL。
如果桌子是空的
| Id | Salary|
| 1 | 100 |
查询应该返回
|SecondHighestSalary|
| null |
而不是
|SecondHighestSalary|
| |
您应该能够使用偏移量1/FETCH 1执行此操作:
您可以使用RANK函数对“薪资”列的值进行排序,并使用CASE语句返回NULL
SELECT
CASE WHEN MAX(SalaryRank) = 1 THEN NULL ELSE Salary as SecondHighestSalary
FROM
(
SELECT *, RANK()OVER(ORDER BY Salary DESC) As SalaryRank
FROM Employee
) AS Tab
WHERE SalaryRank = 2
最好使用densite\u RANK函数,以便在职位出现平局时不会跳过排名。我将使用densite\u RANK&do LEFT JOIN with employee表:
SELECT t.Seq, e.*
FROM ( VALUES (2)
) t (Seq) LEFT JOIN
(SELECT e.*,
DENSE_RANK() OVER (ORDER BY Salary DESC) AS Num
FROM Employee e
) e
ON e.Num = t.Seq;
虽然您可以使用MSSQL 2005或更高版本的CTE或ROWNUMBER,但最简单、更方便的方法是使用子查询进行两次排序
select top 1 x.* from
(select top 2 t1.* from dbo.Employee t1 order by t1.Salary) as x
order by x.Salary desc
如果没有第二个更高的薪水,则必须显示null,这有点棘手,但使用if也很容易做到
if (select count(*) from dbo.Employee) > 1
begin
select top 1 x.* from
(select top 2 emp.* from dbo.Employee emp order by emp.Salary) as x
order by x.Salary desc
end
else begin
select null as Id, null as Salary
end
Obs:。OP没有说明当第二个最大值与第一个相等时该怎么办,但使用此解决方案只需在IF子查询中使用DISTINCT即可。查询:
select top 1 x.* from
(select top 2 t1.* from dbo.Employee t1 order by t1.Salary) as x
order by x.Salary desc
CREATE TABLE a
([Id] int, [Salary] int)
;
INSERT INTO a
([Id], [Salary])
VALUES
(1, 100),
(2, 200),
(3, 300)
;
GO
SELECT Salary as SecondHighestSalary
FROM a
ORDER BY Salary
OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY
您可以尝试上面的代码来查找第二个最高工资。
上面的代码使用减号运算符。
如需进一步参考,请使用以下链接
如果是领带,您需要第二高的不同值。例如,对于值100、200、300、300,您需要200 因此,获取最大值MAXsalary=>300,然后获取小于该值的最大值:
select max(salary) from mytable where salary < (select max(salary) from mytable);
下面是一个简单的方法
SELECT MAX(Salary) FROM table WHERE Salary NOT IN (SELECT MAX(Salary) FROM table);
您可以尝试获得第n个最高工资,其中n=1,2,3…int
SELECT TOP 1 salary FROM (
SELECT TOP n salary
FROM employees
ORDER BY salary DESC) AS emp
ORDER BY salary ASC
希望这对你有帮助。下面是一个实现
create table #salary (salary int)
insert into #salary values (100), (200), (300)
SELECT TOP 1 salary FROM (
SELECT TOP 2 salary
FROM #salary
ORDER BY salary DESC) AS emp
ORDER BY salary ASC
drop table #salary
这里的输出是200,300是第一高,200是第二高,100是第三高,如下所示
salary
200
这里n是2从员工限额1,1中选择薪资
select case
when cnt>1 then SecondHighestSalary
else null end as SecondHighestSalary
from
(select top 1 Salary as SecondHighestSalary,
(select count(distinct Salary) from Employee) as cnt
from (
select distinct top 2 Salary
from Employee
order by Salary desc ) as sal
order by SecondHighestSalary asc) as b
找到第二高薪的非常简单的方法解决Leetcode第二高薪问题的方法是:
Select Max(Salary) AS SecondHighestSalary from Employee where Salary < (Select Max(Salary) from Employee);
第二高是模棱两可。如果打成平局,你想怎么办?例如,将另一条工资为300的记录添加到示例表中。那么:你想展示300还是200?您必须先回答这个问题,然后才能编写查询。@ThorstenKettner即使在平局的情况下,它也应该显示下一个最高值,无论第一个最高值重复多少次。如果没有第二高的值,那么它应该返回NULL。感谢您的回答,但是如果没有第二高的值,例如,如果主表中只有一行,那么即使使用rank也不会返回NULL。它返回“”值。如果有两个或多个不同的薪资,则OFFSET/FETCH有助于返回第二高的值,但如果薪资只有一个值,则它不帮助返回NULL。我们可以跟踪表中总记录的不同计数。若表中有多个不同的计数,则意味着它有第二高的薪水,否则它并没有第二高的薪水。您能重新措辞吗?事实上,它不是很容易理解
Select Max(Salary) AS SecondHighestSalary from Employee where Salary < (Select Max(Salary) from Employee);
select
case when max(salary) is null then null else max(salary) end SecondHighestSalary
from (
select salary , dense_rank() over (order by salary desc) as rn
from Employee
)r
where rn = 2