Подтвердить что ты не робот

SQL-запрос, чтобы найти N-й наивысший заработок из таблицы зарплат

Как я могу найти Nth самую высокую зарплату в таблице, содержащей зарплату в SQL Server?

4b9b3361

Ответ 1

Вы можете использовать выражение Common Table Expression (CTE) для получения ответа.

Скажем, у вас есть следующие зарплаты в таблице. Оклады:

 EmployeeID  Salary
--------------------
     10101   50,000
     90140   35,000
     90151   72,000
     18010   39,000
     92389   80,000

Мы будем использовать:

DECLARE @N int
SET @N = 3  -- Change the value here to pick a different salary rank

SELECT Salary
FROM (
    SELECT row_number() OVER (ORDER BY Salary DESC) as SalaryRank, Salary
    FROM Salaries
) as SalaryCTE
WHERE SalaryRank = @N

Это создаст номер строки для каждой строки после того, как она будет отсортирована по зарплате в порядке убывания, а затем извлечет третью строку (которая содержит третью самую высокую запись).


Для тех из вас, кто не хочет CTE (или застрял в SQL 2000):

[ Примечание: это заметно отличается от приведенного выше примера; их запуск бок о бок с планами исключения показывает стоимость запроса 36% для CTE и 64% для подзапроса]:

SELECT TOP 1 Salary
FROM 
(
    SELECT TOP N Salary
    FROM Salaries
    ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC

где N определяется вами.

SalarySubquery - это псевдоним, который я дал подзапросу, или запрос, который находится в круглых скобках.

Что делает подзапрос, он выбирает верхние зарплаты (в этом случае мы будем говорить 3) и заказываем их самой большой зарплатой.

Если мы хотим увидеть третью самую высокую зарплату, подзапрос вернется:

 Salary
-----------
80,000
72,000
50,000

Внешний запрос затем выбирает первую зарплату из подзапроса, за исключением того, что мы сортируем ее по возрастанию на этот раз, которая сортируется от самого маленького до самого большого, поэтому 50 000 будут первой сортировкой по возрастанию.

Как вы можете видеть, 50 000 человек действительно являются третьей по величине зарплатой в этом примере.

Ответ 2

Вы можете использовать row_number для выбора определенной строки. Например, 42-я самая высокая зарплата:

select  *
from    (
        select  row_number() over (order by Salary desc) as rn
        ,       *
        from    YourTable
        ) as Subquery
where   rn = 42

Оконные функции, такие как row_number, могут отображаться только в предложениях select или order by. Обходной путь помещает row_number в подзапрос.

Ответ 3

select MIN(salary) from (
select top 5 salary from employees order by salary desc) x

Ответ 4

попробуйте...

use table_name
select MAX(salary)
from emp_salary
WHERE marks NOT IN (select MAX(marks)
from student_marks )

Ответ 5

EmpID   Name    Salary
1   A   100
2   B   800
3   C   300
4   D   400
5   E   500
6   F   200
7   G   600

SELECT * FROM Employee E1
WHERE (N-1) = (
                SELECT COUNT(DISTINCT(E2.Salary))
                FROM Employee E2
                WHERE E2.Salary > E1.Salary
              )

Предположим, вы хотите найти 5-ю высшую зарплату, а это значит, что всего 4 сотрудника, у которых зарплата выше 5-го высшего сотрудника. Поэтому для каждой строки из внешнего запроса проверьте общее количество зарплат, превышающее текущую зарплату. Внешний запрос будет работать для 100 в первую очередь и проверяет количество зарплат больше 100. Это будет 6, не соответствует (5-1) = 6 где предложение внешнего запроса. Затем для 800 и проверьте количество зарплат более 800, 4=0 false, тогда работайте на 300 и, наконец, в таблице больше 4 записей, которые больше 300. Поэтому 4=4 встретит предложение where и вернется 3 C 300.

Ответ 6

Простой способ БЕЗ использования какой-либо специальной функции, характерной для Oracle, MySQL и т.д. Предположим, что в таблице EMPLOYEE зарплаты могут быть повторены. Используйте запрос, чтобы узнать рейтинг каждого идентификатора.

select  *
from  (
select tout.sal, id, (select count(*) +1 from (select distinct(sal) distsal from     
EMPLOYEE ) where  distsal >tout.sal)  as rank  from EMPLOYEE tout
) result
order by rank

Сначала мы обнаруживаем отличные зарплаты. Затем мы выясняем количество отличных зарплат больше, чем каждый ряд. Это не что иное, как ранг этого идентификатора. Для высшей зарплаты этот счет будет равен нулю. Итак, "+1" делается для начала ранжирования из 1.

Теперь мы можем получить идентификаторы в N-м ранге, добавив предложение where к вышеуказанному запросу.

select  *
from  (
select tout.sal, id, (select count(*) +1 from (select distinct(sal) distsal from     
EMPLOYEE ) where  distsal >tout.sal)  as rank  from EMPLOYEE tout
) result
where rank = N;

Ответ 7

Не забудьте использовать ключевое слово distinct: -

SELECT TOP 1 Salary
FROM 
(
    SELECT Distinct TOP N Salary
    FROM Salaries
    ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC

Ответ 8

Самый простой способ - получить 2nd higest salary из table в SQL:

sql> select max(sal) from emp where sal not in (select max(sal) from emp);

Ответ 9

Решение 1:. Этот SQL, чтобы найти Nth самую высокую зарплату, должен работать в SQL Server, MySQL, DB2, Oracle, Teradata и почти любой другой СУБД: (обратите внимание: низкая производительность из-за подзапроса)

SELECT * /*This is the outer query part */
FROM Employee Emp1
WHERE (N-1) = ( /* Subquery starts here */
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)

Самое важное, что нужно понять в вышеприведенном запросе, это то, что подзапрос оценивается каждый раз, когда строка обрабатывается внешним запросом. Другими словами, внутренний запрос не может обрабатываться независимо от внешнего запроса, так как внутренний запрос также использует значение Emp1.

Чтобы найти Nth самую высокую зарплату, мы просто находим зарплату, у которой точно зарплата N-1 больше, чем она сама.


Решение 2: Найдите первую зарплату с использованием ключевого слова TOP в SQL Server

SELECT TOP 1 Salary
FROM (
      SELECT DISTINCT TOP N Salary
      FROM Employee
      ORDER BY Salary DESC
      ) AS Emp
ORDER BY Salary

Решение 3: Найдите первую зарплату в SQL Server без использования TOP

SELECT Salary FROM Employee 
ORDER BY Salary DESC OFFSET N-1 ROW(S) 
FETCH FIRST ROW ONLY

Обратите внимание, что я лично не тестировал SQL выше, и я считаю, что он будет работать только в SQL Server 2012 и выше.

Ответ 10

Очень простой один запрос, чтобы найти nth самую высокую зарплату

SELECT DISTINCT(Sal) FROM emp ORDER BY Salary DESC LIMIT n,1