Как получить наивысшую зарплату сотрудников за столом - PullRequest
34 голосов
/ 14 сентября 2011

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

Там в таблице содержатся ID, Имя и Зарплата сотрудников, получают имена сотрудников с наивысшей зарплатой в 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)

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

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

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

Ответы [ 53 ]

1 голос
/ 30 декабря 2018

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

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

0 голосов
/ 26 сентября 2013
select max(sal) , Department no. from employee where sal<max(sal)
0 голосов
/ 20 сентября 2012

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

SELECT Name FROM Employees group BY Salary DESCENDING limit 2;
0 голосов
/ 30 августа 2016

Компиляция четырех решений для проблемы:

Первое решение - использование подзапроса

ВЫБЕРИТЕ МАКС (зарплата) от сотрудника ---- Этот запрос даст вам максимальную зарплату

Теперь используйте вышеуказанный запрос как подзапрос, чтобы получить следующую самую высокую зарплату, как показано ниже:

SELECT MAX(salary) FROM employee WHERE salary <> (SELECT MAX(salary) from Employee) - этот запрос даст вам вторую самую высокую зарплату

Теперь, если вы хотите, чтобы имя сотрудника (ов) получало вторую самую высокую зарплату, используйте приведенный выше запрос как подзапрос, как показано ниже

SELECT name from employee WHERE salary = 
(SELECT MAX(salary) FROM employee WHERE salary <> (SELECT MAX(salary) from Employee)

- этот запрос даст вам вторую самую высокую зарплату)

Второе решение - использование производной таблицы

SELECT TOP 2 DISTINCT(salary) FROM employee ORDER BY salary DESC - Это даст вам две самые высокие зарплаты. То, что вы делаете здесь, - это упорядочиваете зарплаты в порядке убывания, а затем выбираете две верхние зарплаты.

Теперь закажите вышеупомянутый набор результатов в порядке возрастания по зарплате и получите ТОП 1

SELECT TOP 1 salary FROM
(SELECT TOP 2 DISTINCT(salary) FROM employee ORDER BY salary DESC) AS tab 
ORDER BY salary

Третье решение - Использование коррелированного подзапроса

SELECT name, salary FROM Employee e WHERE 2=(SELECT COUNT(DISTINCT salary) FROM Employee p WHERE e.salary<=p.salary)

Четвертое решение - Использование оконной функции

;WITH T AS
(
SELECT *, DENSE_RANK() OVER (ORDER BY Salary Desc) AS Rnk
FROM Employees
)
SELECT Name
FROM T
WHERE Rnk=2;
0 голосов
/ 19 июля 2016

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

SELECT min(salary) 
FROM employee 
WHERE salary IN (SELECT top 2 salary FROM employee ORDER BY salary DESC)
0 голосов
/ 15 декабря 2015

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

SELECT *
FROM emptable 
WHERE empid IN (
    SELECT sal,row_number () ( OVER partition by sal order by sal desc) RN
    FROM emptable
    WHERE RN=2)
0 голосов
/ 22 ноября 2015

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

SELECT
    *
FROM
    Employees
WHERE
    salary IN (
        SELECT
            max(salary)
        FROM
            Employees
        WHERE
            salary NOT IN (
                SELECT
                    max(salary)
                FROM
                    Employees
            )
    );
0 голосов
/ 03 апреля 2014

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

 WITH CTE AS
 (
 SELECT DENSE_RANK() OVER (ORDER BY SALARY DESC)RN,* FROM Users
 )
 SELECT * FROM CTE WHERE RN=2
0 голосов
/ 23 февраля 2013

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

SELECT * FROM emp WHERE salary = (SELECT max(e1.salary) 
FROM emp e1 WHERE e1.salary < (SELECT Max(e2.salary) FROM emp e2))**
0 голосов
/ 26 февраля 2014
SELECT MAX(Salary) FROM Employee
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...