2010-01-29 3 views

ответ

11

Попробуйте что-то вроде:

SELECT TOP 1 compensation FROM (
    SELECT TOP 2 compensation FROM employees 
    ORDER BY compensation DESC 
) AS em ORDER BY compensation ASC 

По существу:

  • Найти верхние 2 зарплаты в порядке убывания.
  • Из них 2, найдите верхнюю зарплату в порядке возрастания.
  • Выбранное значение - это вторая по величине зарплата.

Если зарплата нечеткая, вы можете использовать вместо нее SELECT DISTINCT TOP ....

+1

Когда вознаграждение TOP 1 заработано более чем одним сотрудником, этот запрос вернет неправильный результат. –

+1

Если зарплаты не различны, вы можете использовать 'SELECT DISTINCT TOP ...' вместо этого. –

4

Попробуйте это:

SELECT 
    salary, 
    employeeid 
FROM 
    employees 
ORDER BY 
    salary DESC 
LIMIT 2 

Тогда просто получить вторую строку.

+0

Что делать, если первые две зарплаты одинаковы? – moghya

9

Возможно, вам стоит использовать DENSE_RANK.

SELECT * 
FROM (
     SELECT 
     [Salary], 
     (DENSE_RANK() 
     OVER 
     (
      ORDER BY [Salary] DESC)) AS rnk 
     FROM [Table1] 
     GROUP BY [Num] 
    ) AS A 
WHERE A.rnk = 2 
+3

Замените RANK() на DENSE_RANK(), и он работает. –

+0

да Фрэнк, ты прав – CoderHawk

+0

Соответственно менялся запрос – CoderHawk

47

Попробуйте это:

SELECT max(salary) 
FROM emptable 
WHERE salary < (SELECT max(salary) 
       FROM emptable); 
3
select distinct(t1.sal) 
from emp t1 
where &n=(select count(distinct(t2.sal)) from emp t2 where t1.sal<=t2.sal); 

Выход: Введите значение для п: если вы хотите, второй самый высокий, введите 2; если вы хотите 5, введите п = 3

2
select * from compensation where Salary = (
     select top 1 Salary from (
     select top 2 Salary from compensation 
     group by Salary order by Salary desc) top2 
     order by Salary) 

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

2
select max(Salary) from Employee 
where Salary 
not in (Select Max(Salary) from Employee) 
2
select max(Salary) from Employee 
where Salary 
    not in (Select top4 salary from Employee); 

, потому что ответ заключается в следующем

макс (5,6,7,8)

так пятые самый высокий рекорд будет будет отображаться, первый четыре не будет считаться

2

Попробуйте это:

select max(Emp_Sal) 
from Employee a 
where 1 = (select count(*) 
     from Employee b 
     where b.Emp_Sal > a.Emp_Sal) 
+0

Это не работает, если есть дубликаты зарплат. Допустим, что есть три одинаковых максимальной зарплаты 30000, и вы находите второе место. –

3

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

SELECT MAX(salary) FROM employee 
WHERE salary NOT IN (
    SELECT MAX (salary) FROM employee 
) 

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

SELECT salary FROM (
    SELECT DISTINCT(salary) FROM employee ORDER BY salary DESC 
) WHERE rownum<=2 

Эти запросы работают нормально, потому что я использовал

+0

на самом деле, если у вас есть таблица: 1. 100 2. 100 3. 50 Ваш запрос будет возвращать ** нуль **, который неправильный ответ в этом случае – kvatashydze

2
SELECT 
    TOP 1 salary 
FROM 
    (
     SELECT 
      TOP 2 salary 
     FROM 
      employees 
    ) sal 
ORDER BY 
    salary DESC; 
2
select max(sal) from emp 
where sal not in (select max(sal) from emp) 

ИЛИ

select max(salary) from emp table 
where sal<(select max(salary)from emp) 
9

Большинство других ответов кажутся дб специфичны.

Общего SQL-запрос должен выглядеть следующим образом:

select sal from emp a where N = (select count(distinct sal) from emp b where a.sal <= b.sal) 
where N = any value. 

и этот запрос должен быть в состоянии работать на любой базе данных.

+0

Отличный ответ +1 – anubhava

5
select max(Emp_Sal) 
from Employee a 
where 1 = (select count(*) 
     from Employee b 
     where b.Emp_Sal > a.Emp_Sal) 

Да бегущий человек.

4

// Чтобы выбрать имя сотрудника, чья зарплата составляет второй по величине

SELECT name 
FROM employee WHERE salary = 
     (SELECT MIN(salary) FROM 
      (SELECT TOP (2) salary 
       FROM employee 
       ORDER BY salary DESC)) 
33

Простой ответ:

SELECT sal 
FROM emp 
ORDER BY sal DESC 
LIMIT 1, 1; 

Вы получите только вторую максимальную зарплату.

И если вам нужно какое-либо 3-е или 4-е или N-е значение, вы можете увеличить первое значение, за которым следует LIMIT (n-1) т.е.4-й зарплаты: LIMIT 3, 1;

+1

Это хотят работать если у вас есть 2 записи с одинаковой зарплатой. Он хочет дать вам второй макс. –

+1

@mukeshpatel необходимо использовать, чтобы указать на это. – SandeepGodara

+0

Короткие и прекрасные –

1
select * from emp 
where sal=(select min(sal) from 
(select sal from(select distinct sal from emp order by sal desc) 
where rownum<=n)); 

п может быть значение, которое вы хотите увидеть ......

вы можете увидеть все поля этого лица, имеющего п-ю самую высокую зарплату * сильный текст *