2010-11-28 1 views
0

HI, Можете ли вы сказать синтаксис команды SQL, которая дает в качестве вывода вторую самую высокую зарплату из диапазона зарплат, хранящихся в таблице сотрудников. Описание SQL commnd будет приветствоваться ... Пожалуйста, помогите !!!SQL-команда для поиска второй самой высокой зарплаты

+1

возможный дубликат [SQL запрос, чтобы найти энный самую высокую зарплату из таблицы заработной платы] (http://stackoverflow.com/questions/3850034/sql-query-to-find-nth-high-зарплата-от-зарплаты-таблица) – LittleBobbyTables 2010-11-28 14:23:58

+0

Другой вопрос и его ответы относятся к SQL Server и т. д. Так вот ответы здесь с TOP – fredt 2010-11-28 14:49:11

ответ

1
with tempTable as(
    select top 2 max(salary) as MaxSalary from employee order by salary desc 
) select top 1 MaxSalary from tempTable 

Описание:

  1. выбрать верхние 2 максимальные зарплаты
  2. порядка их от порядка по убыванию (поэтому вторая самая высокая зарплата в настоящее время в верхней части)
  3. выберите верхний 1 от

другой подход:

select top 1 MaxSalary from (
    select top 2 max(salary) as MaxSalary from employee order by salary desc 
) 
+1

Это не сработает. Функция max() вернет только 1 результат. – IamIC 2010-11-28 17:44:05

+0

попробуйте сначала, пожалуйста – 2010-11-28 17:52:39

+0

Я проверил его ... агрегатные функции возвращают только одну запись. :) – IamIC 2010-11-28 17:54:49

6
select min(salary) from 
(select top 2 salary from SalariesTable order by salary desc) 
as ax 
0

Вы не указываете фактический продукт 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 

, а затем пропуская первый возвращенный ряд.

5

Это должно работать:

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!

0

Вот некоторые примеры кода, с доказательством концепции:

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 в любом случае).

0

Альтернативных (проверено):

select Min(Salary) from (
    select distinct TOP (2) salary from employees order by salary DESC) AS T 

Это будет работать на любой платформе, является чистым, и идеально подходит для возможности нескольких привязанных # 1 зарплаты.

0

Выберите верхний 1 * от сотрудника, где EmpId в (выберите 2 сверху (EmpId) от заказа сотрудника по заработной плате DESC) ORDER BY зарплаты ASC

Объяснение:

выбрать топ 2 (EmpId) от того сотрудника по зарплате DESC предоставит две записи, для которых Зарплата сверху, а затем весь запрос будет сортировать эти две записи в порядке ASCENDING, а затем перечислить тот, у которого самая низкая зарплата среди них.

EX. пусть зарплата сотрудников составляет 100, 99, 98, 50.

Запрос 1 возвратит EMP идентификатор лиц с продажами 100 и 99

Всего запрос будет возвращать все данные, связанные с лицом, имеющей зарплату 99.

0
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().

Спасибо, Суреш

0

Простой способ ..

select MAX(salary) as SecondMax from test where salary !=(select MAX(salary) from test)