Вторая самая высокая зарплата - PullRequest
0 голосов
/ 14 ноября 2018

Напишите запрос SQL, чтобы получить вторую по величине зарплату из таблицы Employee.

    | Id | Salary |
    | 1  | 100    |
    | 2  | 200    |
    | 3  | 300    |

Например, с учетом приведенной выше таблицы сотрудников, запрос должен возвращать 200 в качестве второго по величине оклада. Если второго по величине оклада нет, запрос должен вернуть ноль.

    | 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|
   |                   |

Ответы [ 9 ]

0 голосов
/ 15 ноября 2018

Вот простой способ сделать это

SELECT MAX(Salary) FROM table WHERE Salary NOT IN (SELECT MAX(Salary) FROM table);
0 голосов
/ 03 декабря 2018

Вы можете попробовать это для получения 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

0 голосов
/ 14 ноября 2018
SELECT id, MAX(salary) AS salary 
FROM employee 
WHERE salary IN
(SELECT salary FROM employee MINUS SELECT MAX(salary) 
FROM employee); 

Вы можете попробовать код выше, чтобы найти 2-й максимальный оклад.Приведенный выше код использует оператор МИНУС.Для дальнейшего использования используйте ссылки ниже https://www.techonthenet.com/sql/minus.php https://www.geeksforgeeks.org/sql-query-to-find-second-largest-salary/

0 голосов
/ 14 ноября 2018

В случае связей вы хотите получить второе по значимости значение.Например, для значений 100, 200, 300, 300 вы хотите 200.

Итак, получите самое высокое значение (MAX(salary) => 300), а затем получите самое большое значение меньше этого:

select max(salary) from mytable where salary < (select max(salary) from mytable);
0 голосов
/ 14 ноября 2018

Запрос:

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
| SecondHighestSalary |
| ------------------: |
|                 200 |
0 голосов
/ 14 ноября 2018

Хотя вы можете использовать CTE (из MSSQL 2005 или более поздней версии) или 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

Необходимое для отображения нуля, когда нет второй большей зарплаты, немного сложнее, но также легко сделать с 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 не говорит, что делать, когда второй по величине является связью с первым, но использование этого решения - простой вопрос использования DISTINCT в подзапросе IF.

0 голосов
/ 14 ноября 2018

Я бы использовал DENSE_RANK() и сделал бы LEFT JOIN с таблицей сотрудников:

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;
0 голосов
/ 14 ноября 2018

Вы можете использовать функцию RANK () для ранжирования значений для столбца Зарплата.

SELECT *
FROM
(
 SELECT *, RANK()OVER(ORDER BY Salary DESC) As SalaryRank
 FROM Employee 
) AS Tab
WHERE SalaryRank = 2
0 голосов
/ 14 ноября 2018

Вы должны сделать это с помощью OFFSET 1 / FETCH 1:

https://technet.microsoft.com/en-us/library/gg699618(v=sql.110).aspx

...