3-я по величине зарплата в каждом отделе - PullRequest
0 голосов
/ 11 июля 2020

У меня есть следующие таблицы: https://pastebin.com/Js0Sm69S (CREATE и INSERT отчеты).

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

Мне удалось этого добиться: введите описание изображения здесь Используя следующий запрос:

SELECT *,
       DENSE_RANK() OVER 
       (PARTITION BY DepartmentId ORDER BY Salary DESC) AS DRank
FROM Employees

Я не уверен, что DENSE_RANK() - лучшая функция ранжирования для использования здесь. Может быть, нет, потому что WHERE DRank=3 может возвращать более одного результата (но мы можем сказать TOP(1)). Что Вы думаете об этом? Как теперь отобразить третью по величине зарплату в каждом отделе, если она есть?

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

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

WITH cte AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY DepartmentId ORDER BY Salary DESC) AS DRank
   FROM Employees
)
SELECT *
FROM cte
WHERE DRank= 3
0 голосов
/ 11 июля 2020

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


Select EmployeeID,FirstName,DepartmentID,Salary
 From (
Select *
      ,RN  = Row_Number() over (Partition By DepartmentID Order By Salary)
      ,Cnt = sum(1) over (Partition By DepartmentID)
 From  Employees
      ) A
 Where RN = case when Cnt<3 then Cnt else 3 end
...