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

Как получить зарплату второго уровня в таблице

Это вопрос, который я получил сегодня днем:

Там таблица содержит идентификатор, имя и зарплату сотрудников, получает имена сотрудников с высшим зарплатом в SQL Server

Вот мой ответ, я просто написал его в газете и не уверен, что он совершенно правдоподобен, но, похоже, работает:

SELECT Name FROM Employees WHERE Salary = 
( SELECT DISTINCT TOP (1) Salary FROM Employees WHERE Salary NOT IN
 (SELECT DISTINCT TOP (1) Salary FROM Employees ORDER BY Salary DESCENDING)
ORDER BY Salary DESCENDING)

Я думаю, что это уродливо, но это единственное решение приходит мне на ум.

Вы можете предложить мне лучший запрос?

Большое спасибо.

4b9b3361

Ответ 1

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

;WITH T AS
(
SELECT *,
       DENSE_RANK() OVER (ORDER BY Salary Desc) AS Rnk
FROM Employees
)
SELECT Name
FROM T
WHERE Rnk=2;

Если индексирование Зарплаты может быть более эффективным, особенно если есть много сотрудников.

SELECT Name
FROM   Employees
WHERE  Salary = (SELECT MIN(Salary)
                 FROM   (SELECT DISTINCT TOP (2) Salary
                         FROM   Employees
                         ORDER  BY Salary DESC) T);

Тест Script

CREATE TABLE Employees
  (
     Name   VARCHAR(50),
     Salary FLOAT
  )

INSERT INTO Employees
SELECT TOP 1000000 s1.name,
                   abs(checksum(newid()))
FROM   sysobjects s1,
       sysobjects s2

CREATE NONCLUSTERED INDEX ix
  ON Employees(Salary)

SELECT Name
FROM   Employees
WHERE  Salary = (SELECT MIN(Salary)
                 FROM   (SELECT DISTINCT TOP (2) Salary
                         FROM   Employees
                         ORDER  BY Salary DESC) T);

WITH T
     AS (SELECT *,
                DENSE_RANK() OVER (ORDER BY Salary DESC) AS Rnk
         FROM   Employees)
SELECT Name
FROM   T
WHERE  Rnk = 2;

SELECT Name
FROM   Employees
WHERE  Salary = (SELECT DISTINCT TOP (1) Salary
                 FROM   Employees
                 WHERE  Salary NOT IN (SELECT DISTINCT TOP (1) Salary
                                       FROM   Employees
                                       ORDER  BY Salary DESC)
                 ORDER  BY Salary DESC)

SELECT Name
FROM   Employees
WHERE  Salary = (SELECT TOP 1 Salary
                 FROM   (SELECT TOP 2 Salary
                         FROM   Employees
                         ORDER  BY Salary DESC) sel
                 ORDER  BY Salary ASC)  

Ответ 2

SELECT * from Employee 
WHERE Salary IN (SELECT MAX(Salary) 
                 FROM Employee 
                 WHERE Salary NOT IN (SELECT MAX(Salary) 
                                      FFROM employee));

Попробуй вот так..

Ответ 3

Это может помочь вам

SELECT 
      MIN(SALARY) 
FROM 
      EMP 
WHERE 
      SALARY in (SELECT 
                      DISTINCT TOP 2 SALARY 
                 FROM 
                      EMP 
                 ORDER BY 
                      SALARY DESC
                )

Мы можем найти любую nth самую высокую зарплату, поместив n (где n > 0) вместо 2

Пример для 5 th самой высокой зарплаты мы ставим n = 5

Ответ 4

Как насчет CTE?

;WITH Salaries AS
(
    SELECT Name, Salary,
       DENSE_RANK() OVER(ORDER BY Salary DESC) AS 'SalaryRank'
    FROM 
        dbo.Employees
)
SELECT Name, Salary
FROM Salaries  
WHERE SalaryRank = 2

DENSE_RANK() предоставит вам всех сотрудников, у которых есть вторая самая высокая заработная плата - независимо от того, сколько сотрудников имеют (одинаковые) самые высокие зарплаты.

Ответ 5

Еще один интуитивный способ: - Предположим, мы хотим найти Nth самую высокую зарплату, тогда

1) Отсортировать работника в порядке убывания заработной платы

2) Возьмите первые N записей, используя rownum. Таким образом, на этом этапе N-й рекорд - это Nth самая высокая зарплата

3) Теперь отсортируйте этот временный результат в порядке возрастания. Таким образом, N-я наивысшая зарплата теперь первая запись

4) Получите первую запись из этого временного результата.

Это будет N-я наивысшая зарплата.

select * from 
 (select * from 
   (select * from  
       (select * from emp order by sal desc)  
   where rownum<=:N )  
 order by sal )
where rownum=1;

В случае повторения зарплаты тогда можно использовать самые внутренние запросы.

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

Ответ 6

select MAX(Salary) from Employee WHERE Salary NOT IN (select MAX(Salary) from Employee );

Ответ 7

Все следующие запросы работают для MySQL:

SELECT MAX(salary) FROM Employee WHERE Salary NOT IN (SELECT Max(Salary) FROM Employee);

SELECT MAX(Salary) From Employee WHERE Salary < (SELECT Max(Salary) FROM Employee);

SELECT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1;

SELECT Salary FROM (SELECT Salary FROM Employee ORDER BY Salary DESC LIMIT 2) AS Emp ORDER BY Salary LIMIT 1;

Ответ 8

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

Предположим, что таблица EMPLOYEE имеет следующие данные. Заработная плата может быть повторена. enter image description here

В ручном анализе мы можем определить ранги следующим образом: -
enter image description here

Тот же результат может быть достигнут с помощью запроса

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

enter image description here

Сначала мы обнаруживаем отличные зарплаты. Затем мы выясняем количество отличных зарплат больше, чем каждый ряд. Это не что иное, как ранг этого идентификатора. Для высшей зарплаты этот счет будет равен нулю. Итак, "+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;

Ответ 9

Я думаю, вы бы хотели использовать DENSE_RANK, поскольку не знаете, сколько сотрудников имеют одинаковую зарплату, и вы сказали, что хотите, чтобы имяS сотрудников.

CREATE TABLE #Test
(
    Id INT,
    Name NVARCHAR(12),
    Salary MONEY
)

SELECT x.Name, x.Salary
FROM
        (
        SELECT  Name, Salary, DENSE_RANK() OVER (ORDER BY Salary DESC) as Rnk
        FROM    #Test
        ) x
WHERE x.Rnk = 2

ROW_NUMBER предоставит вам уникальную нумерацию, даже если зарплата будет привязана, а простая RANK не даст вам "2" в качестве ранга, если у вас было много людей, которые связывают с самой высокой зарплатой. Я исправил это, поскольку DENSE_RANK выполняет лучшую работу для этого.

Ответ 10

Ниже можно найти запрос n-го максимального значения, просто замените 2 на n-ое число

select * from emp e1 where 2 =(select count(distinct(salary)) from emp e2
   where e2.emp >= e1.emp)

Ответ 11

select * from emp where salary = (  
    select salary from   
       (select ROW_NUMBER() over (order by salary) as 'rownum', *
        from emp) t -- Order employees according to salary  
    where rownum = 2 -- Get the second highest salary
)

Ответ 12

select max(age) from yd where age<(select max(age) from HK) ; /// True two table Highest 

SELECT * FROM HK E1 WHERE 1 =(SELECT COUNT(DISTINCT age) FROM HK E2 WHERE E1.age < E2.age); ///Second Hightest age RT single table 

select age from hk e1 where (3-1) = (select count(distinct (e2.age)) from yd e2 where e2.age>e1.age);//// same True Second Hight age RT two table

select max(age) from YD where age not in (select max(age) from YD);  //second hight age in single table 

Ответ 13

Можно ли использовать

select e2.max(sal), e2.name
from emp e2
where (e2.sal <(Select max (Salary) from empo el))
group by e2.name

Пожалуйста, дайте мне знать, что не так с этим подходом

Ответ 14

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

Ответ 15

SELECT * 
FROM TABLE1 AS A 
WHERE NTH HIGHEST NO.(SELECT COUNT(ATTRIBUTE) FROM TABLE1 AS B) WHERE B.ATTRIBUTE=A.ATTRIBUTE;

Ответ 16

это простой запрос. Если u хочет второй минимум, просто измените max на min и измените значение меньше (<) до более чем ( > ).

    select max(column_name) from table_name where column_name<(select max(column_name) from table_name)

Ответ 17

Попробуйте это, чтобы получить соответствующую первую зарплату.

SELECT
    *
FROM
    emp e1
WHERE
    2 = (
        SELECT
            COUNT(salary)
        FROM
            emp e2
        WHERE
            e2.salary >= e1.salary
    )

Ответ 18

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

SELECT employee_name 
FROM employee
WHERE salary = (SELECT max(salary) 
                FROM employee
                WHERE salary < (SELECT max(salary) 
                                FROM employee);

Ответ 20

Здесь я использовал два запроса для следующих сценариев, которые задаются во время интервью
Первый сценарий:
Найти всю вторую по величине зарплату в таблице (Вторая по величине зарплата с более чем один сотрудник)

select * from emp where salary
   In (select MAX(salary) from emp where salary NOT IN (Select MAX(salary) from 
   emp));

Второй сценарий:
Найдите в таблице только вторую по величине зарплату

select min(temp.salary) from (select * from emp order by salary desc limit 2) 
  temp;

Ответ 21

Большинство ответов верны. Вы можете использовать смещение с отсортированной зарплатой, как показано ниже,

SELECT NAME
FROM EMPLOYEES
WHERE SALARY IN
(
    SELECT DISTINCT 
           SALARY
    FROM EMPLOYEES
    ORDER BY SALARY DESC
    OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY
);

Чтобы найти n-ую самую высокую зарплату, замените смещение 1 на n

Ответ 22

Я думаю, что это, наверное, самый простой из партии.

SELECT Name FROM Employees group BY Salary DESCENDING limit 2;

Ответ 23

Попробуйте это. Это даст динамические результаты независимо от количества строк

SELECT * FROM emp WHERE salary = (SELECT max(e1.salary) 
FROM emp e1 WHERE e1.salary < (SELECT Max(e2.salary) FROM emp e2))**

Ответ 24

Здесь простой подход:

select name
from employee
where salary=(select max(salary)
              from(select salary from employee
                   minus
                   select max(salary) from employee));

Ответ 25

SELECT `salary` AS emp_sal, `name` , `id`
FROM `employee`
GROUP BY `salary` ORDER BY `salary` DESC
LIMIT 1 , 1 

Ответ 26

declare

cntr number :=0;

cursor c1 is

select salary from employees order by salary desc;

z c1%rowtype;

begin

open c1;

fetch c1 into z;

while (c1%found) and (cntr <= 1) loop


cntr := cntr + 1;

fetch c1 into z;

dbms_output.put_line(z.salary);

end loop;

end;

Ответ 27

Я хочу опубликовать здесь, возможно, самое простое решение. Он работал в mysql.

Пожалуйста, проверьте также и на своем конце:

SELECT name
FROM `emp`
WHERE salary = (
SELECT salary
FROM emp e
ORDER BY salary DESC
LIMIT 1
OFFSET 1 

Ответ 28

select 
    max(salary) 
from 
    emp_demo_table 
where 
    salary < (select max(salary) from emp_demo_table)

Надеюсь, что это разрешит запрос в простейшем из терминов.

Спасибо

Ответ 29

SELECT MAX(Salary) FROM Employee
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee)

Ответ 30

Используя этот SQL, вторая самая высокая зарплата будет получена с именем Employee

Select top 1 start at 2 salary from employee group by salary order by salary desc;