Как найти всех пятых самых высокооплачиваемых сотрудников в одном запросе в SQL Server - PullRequest
1 голос
/ 04 мая 2011

Как найти всех пятых самых высокооплачиваемых сотрудников в одном запросе в SQL Server

DECLARE @result bigint

SELECT TOP 5 @result = EmpID FROM Employees ORDER BY Salary DESC

SELECT @result

Выше запрос дает мне ровно одну запись на пятой самой высокой позиции, но я хочу all из fifth самых высокооплачиваемых EmpID's в Employees таблице.

На указанный выше запрос ссылается Как найти пятую наивысшую зарплату в одном запросе в SQL Server

Ответы [ 5 ]

13 голосов
/ 04 мая 2011

В SQL Server 2005 и более поздних версиях вы можете использовать одну из функций ранжирования для достижения этой цели:

;WITH RankingEmployees AS
(
    SELECT 
       EmpID,
       DENSE_RANK() OVER(ORDER BY Salary DESC) 'SalaryRank'
    FROM dbo.Employees 
)
SELECT
   *
FROM
   RankingEmployees
WHERE
   SalaryRank = 5

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

1 голос
/ 20 декабря 2015

Это можно сделать, используя также подзапрос.Ниже SQL-запрос выполняет ту же работу

SELECT TOP 1 SALARY
FROM (
      SELECT DISTINCT TOP 5 SALARY
      FROM EMPLOYEES
      ORDER BY SALARY DESC
      ) RESULT
ORDER BY SALARY

Более подробную информацию об этом можно найти в моем блоге Как найти n-ю самую высокую зарплату с помощью SQL-запроса

Такжеэто может быть достигнуто через CTE и с помощью DENSE_RANK()

 WITH RESULT AS
(
    SELECT SALARY,
           DENSE_RANK() OVER (ORDER BY SALARY DESC) AS DENSERANK
    FROM EMPLOYEES
)
SELECT TOP 1 SALARY
FROM RESULT
WHERE DENSERANK = N

Просто замените N на наибольшее число зарплат, которое вам нужно найти.

0 голосов
/ 19 июня 2013

Попробуй так:

SELECT * 
  FROM EMPLOYEE AS EMP1
  WHERE 4 =
      (
       SELECT count(Distint(EMP2.SALARY)
         FROM EMPLOYEE AS EMP2
          WHERE EMP2.SALARY> EMP1.SALARY 
      )
0 голосов
/ 06 июня 2013
SELECT * 
FROM (Select * From Employee Order By salary Desc)
WHERE ROWNUM <= 5;

Внутренний запрос, т.е. Select * From Employee Order By salary Desc, вернет всех сотрудников из таблицы Employee, отсортированных по столбцу Salary DESCENDING.

Используя rownum, мы можем отфильтроватьпервые 5 записей.

Хорошо, я неправильно указал ваш qns. Будет работать следующий запрос.

Select * From (Выберите ename, sal, dens_rank () over (order by sal desc)как ранг От emp), где ранг <5 по рангу; </p>

0 голосов
/ 18 сентября 2011
DECLARE @result bigint

SELECT TOP 5 @result = EmpID 
FROM Employees 
ORDER BY Salary DESC

SELECT @result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...