Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 第二高薪_Sql_Sql Server_Sql Server 2008_Sql Server 2012 - Fatal编程技术网

Sql 第二高薪

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提出的问题,我为此输入了以下代码:

编写SQL查询以从Employee表中获取第二高的薪资

    | 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