Привет, Можете ли вы сказать мне синтаксис команды SQL, которая выводит вторую по величине зарплату из диапазона зарплат, хранящихся в таблице сотрудников. Описание команды SQL приветствуется... Пожалуйста, помогите!!!
Команда SQL для поиска второй по величине зарплаты
Ответы (9)
Это должно работать:
select * from (
select t.*, dense_rank() over (order by salary desc) rnk from employee t
) a
where rnk = 2;
Возвращает вторую по величине зарплату.
dense_rank() over
— это оконная функция, и она дает вам ранг определенной строки в указанном наборе. Это это стандартный SQL, определенный в SQL:2003.
Оконные функции в целом великолепны, они упрощают множество сложных запросов.
Немного другое решение:
Это идентично, за исключением того, что возвращает самую высокую зарплату, когда есть ничья для номера 1:
select * from (
select t.*, row_number() over (order by salary desc) rnk from employee t
) a
where rnk = 2;
Обновлено: ранг изменен на плотный_ранг и добавлено второе решение. Спасибо, ЯнК!
with tempTable as(
select top 2 max(salary) as MaxSalary from employee order by salary desc
) select top 1 MaxSalary from tempTable
описание:
- выберите 2 лучших максимальных зарплаты
- упорядочить их по убыванию (так что 2-я самая высокая зарплата теперь вверху)
- выберите 1 из них
другой подход:
select top 1 MaxSalary from (
select top 2 max(salary) as MaxSalary from employee order by salary desc
)
Вот пример кода с доказательством концепции:
declare @t table (
Salary int
)
insert into @t values (100)
insert into @t values (900)
insert into @t values (900)
insert into @t values (400)
insert into @t values (300)
insert into @t values (200)
;WITH tbl AS (
select t.Salary, DENSE_RANK() OVER (order by t.Salary DESC) AS Rnk
from @t AS t
)
SELECT *
FROM tbl
WHERE Rnk = 2
DENSE_RANK является обязательным (измените на RANK, и вы увидите).
Вы также увидите, почему любые запросы SELECT TOP 2 не будут работать (во всяком случае, без DISTINCT).
Вы не указываете фактический продукт SQL, который вы используете, и язык запросов зависит от продукта. Тем не менее, что-то вроде этого должно помочь вам начать:
SELECT salary FROM employees E1
WHERE 1 = (SELECT COUNT(*) FROM employee E2 WHERE E2.salary > E1.salary)
(спасибо Фредту за исправление).
В качестве альтернативы (и быстрее с точки зрения производительности) будет
SELECT TOP 2 salary FROM employees ORDER BY salary DESC
а затем пропустить первую возвращенную строку.
Альтернатива (проверено):
select Min(Salary) from (
select distinct TOP (2) salary from employees order by salary DESC) AS T
Это будет работать на любой платформе, чисто и обеспечивает возможность нескольких связанных зарплат №1.
Выберите 1 лучших * из сотрудников, где находится empID (выберите 2 лучших (empID) из заказа сотрудников по зарплате DESC) ORDER BY зарплата ASC
Объяснение:
выберите первые 2 (empID) из порядка сотрудников по зарплате. DESC даст две записи, для которых зарплата является верхней, а затем весь запрос отсортирует эти две записи в порядке ВОЗРАСТА, а затем перечислит ту, у которой самая низкая зарплата среди двух.
БЫВШИЙ. пусть зарплаты служащих равны 100, 99, 98, 50.
Запрос 1 вернет emp ID людей с sal 100 и 99.
Весь запрос вернет все данные, относящиеся к человеку с зарплатой 99.
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,ROW_NUMBER() OVER(ORDER BY Salary) As Rank
FROM EMPLOYEE
) A
WHERE A.Rank=n;
где n — номер самого высокого оклада ur, запрашивающего таблицу. Вы также можете использовать функцию DenseRank() вместо ROW_NUMBER().
Спасибо, Суреш
Более простой способ..
select MAX(salary) as SecondMax from test where salary !=(select MAX(salary) from test)