Найти N-ую самую высокую зарплату - PullRequest
0 голосов
/ 03 декабря 2018

Напишите SQL-запрос, чтобы получить n-ю самую высокую зарплату из таблицы Employee (SQL Server)

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

В этом примере n-я самая высокая зарплата, где n = 2, равна 200. Если естьнет n-й наивысшей зарплаты, тогда запрос должен возвращать ноль.

| getNthHighestSalary(2) |
+------------------------+
| 200                    |

Есть ли способ написать этот запрос, кроме как с помощью функции?

Ответы [ 6 ]

0 голосов
/ 03 декабря 2018

Следующее делает почти точно то, что вы хотите:

select salary
from employee
order by salary desc
offset <n> rows fetch next 1 row only;

Единственная проблема заключается в том, что он не возвращает NULL, когда такой зарплаты нет.Вы можете обрабатывать с помощью подзапроса:

select (select salary
        from employee
        order by salary desc
        offset <n> rows fetch next 1 row only
       ) as salary;

Если вы хотите, чтобы связи имели одинаковое ранжирование, тогда используйте select distinct salary в подзапросе.

0 голосов
/ 03 декабря 2018

Вы можете просто попробовать это, используя коррелированный подзапрос, чтобы найти N-ю самую высокую зарплату в таблице Employee.

SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
0 голосов
/ 03 декабря 2018

Находит зарплату, для которой существует ровно 8 более высоких зарплат,значение находит 9-ую самую высокую зарплату .Возвращает NULL, если нет 9-й зарплаты:

SELECT DISTINCT e.Salary FROM Employee e WHERE
(SELECT COUNT(*) FROM Employee ie WHERE ie.Salary > e.Salary) = 8
UNION 
SELECT NULL WHERE (SELECT COUNT(Salary) FROM Employee) < 9
0 голосов
/ 03 декабря 2018

Другой возможный подход - использование функций ROW_NUMBER () или DENSE_RANK ().Важно знать, может ли быть больше одной зарплаты на N-й позиции или до нее.

CREATE TABLE #Salary (
    [id] int,
    [salary] numeric(10, 2)
)

INSERT #Salary 
    ([id], [salary])
VALUES
    (1, 100),
    (2, 500),
    (3, 200),
    (4, 300),
    (5, 200);

DECLARE @Position int = 2;

-- With possible duplicate salaries
WITH cte AS (
    SELECT 
        [id], [salary],
        DENSE_RANK() OVER (ORDER BY [salary] ASC) AS [DRPosition]
    FROM #Salary
)
SELECT [id]
FROM cte
WHERE [DRPosition] = @Position
ORDER BY [DRPosition];

-- Without possible duplicate salaries
WITH cte AS (
    SELECT 
        [id], [salary],
        ROW_NUMBER() OVER (ORDER BY [salary] ASC) AS [RPosition]
    FROM #Salary
)
SELECT [id]
FROM cte
WHERE [RPosition] = @Position
ORDER BY [RPosition]
0 голосов
/ 03 декабря 2018

Вы можете попробовать это, используя row_number()

WITH CTE AS
(
    SELECT EmpID, Salary,
           RN = ROW_NUMBER() OVER (ORDER BY Salary DESC)
    FROM Employee
)
SELECT EmpID, Salary
FROM CTE
WHERE RN = n
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), (400), (500)

SELECT TOP 1 salary FROM (
   SELECT TOP 3 salary 
   FROM #salary 
   ORDER BY salary DESC) AS emp 
ORDER BY salary ASC

drop table #salary

Выходное значение здесь составляет 300, так как 500 является первым самым высоким, 400 является вторым самым высоким и 300 является третьим самым высоким, как показано ниже

salary
300

Здесьn равно 3

...