Как получить зарплату второго уровня в таблице
Это вопрос, который я получил сегодня днем:
Там таблица содержит идентификатор, имя и зарплату сотрудников, получает имена сотрудников с высшим зарплатом в 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)
Я думаю, что это уродливо, но это единственное решение приходит мне на ум.
Вы можете предложить мне лучший запрос?
Большое спасибо.
Ответы
Ответ 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);
Ответ 19
Попробуйте этот
select * from
(
select name,salary,ROW_NUMBER() over( order by Salary desc) as
rownum from employee
) as t where t.rownum=2
http://askme.indianyouth.info/details/write-a-sql-query-to-find-the-10th-highest-employee-salary-from-an-employee-table-explain-your-answer-111
Ответ 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;