HI, Можете ли вы сказать синтаксис команды SQL, которая дает в качестве вывода вторую самую высокую зарплату из диапазона зарплат, хранящихся в таблице сотрудников. Описание SQL commnd будет приветствоваться ... Пожалуйста, помогите !!!SQL-команда для поиска второй самой высокой зарплаты
ответ
with tempTable as(
select top 2 max(salary) as MaxSalary from employee order by salary desc
) select top 1 MaxSalary from tempTable
Описание:
- выбрать верхние 2 максимальные зарплаты
- порядка их от порядка по убыванию (поэтому вторая самая высокая зарплата в настоящее время в верхней части)
- выберите верхний 1 от
другой подход:
select top 1 MaxSalary from (
select top 2 max(salary) as MaxSalary from employee order by salary desc
)
select min(salary) from
(select top 2 salary from SalariesTable order by salary desc)
as ax
Вы не указываете фактический продукт SQL, который используете, и язык запросов различается среди продуктов. Тем не менее, что-то вроде этого должно начать вас:
SELECT salary FROM employees E1
WHERE 1 = (SELECT COUNT(*) FROM employee E2 WHERE E2.salary > E1.salary)
(спасибо fredt за исправление).
В качестве альтернативы (и быстрее, с точки зрения производительности) будет
SELECT TOP 2 salary FROM employees ORDER BY salary DESC
, а затем пропуская первый возвращенный ряд.
Это должно работать:
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.
Функции окна awesome в целом, они просто много сложных запросов.
Немного другое решение:
Это идентично, за исключением того возвращает самую высокую зарплату, когда есть связь для числа 1:
select * from (
select t.*, row_number() over (order by salary desc) rnk from employee t
) a
where rnk = 2;
Обновлено: Changed ранга DENSE_RANK и добавил второй решение. Спасибо, IanC!
Вот некоторые примеры кода, с доказательством концепции:
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 в любом случае).
Альтернативных (проверено):
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 предоставит две записи, для которых Зарплата сверху, а затем весь запрос будет сортировать эти две записи в порядке ASCENDING, а затем перечислить тот, у которого самая низкая зарплата среди них.
EX. пусть зарплата сотрудников составляет 100, 99, 98, 50.
Запрос 1 возвратит EMP идентификатор лиц с продажами 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;
где п число высшая зарплата ур, запрашивающая таблицу. Ucan также использует функцию DenseRank() вместо ROW_NUMBER().
Спасибо, Суреш
Простой способ ..
select MAX(salary) as SecondMax from test where salary !=(select MAX(salary) from test)
возможный дубликат [SQL запрос, чтобы найти энный самую высокую зарплату из таблицы заработной платы] (http://stackoverflow.com/questions/3850034/sql-query-to-find-nth-high-зарплата-от-зарплаты-таблица) – LittleBobbyTables 2010-11-28 14:23:58
Другой вопрос и его ответы относятся к SQL Server и т. д. Так вот ответы здесь с TOP – fredt 2010-11-28 14:49:11