Повторите запрос для каждого значения в столбце и объедините все результаты - PullRequest
0 голосов
/ 07 октября 2019

Я написал запрос, который дает мне 3 верхние зарплаты для идентификатора отдела . Например для DepartmentId=100:

select distinct top 3 e.Id, e.Salary, dep.Id
from Employee e
inner join Department dep on e.DepartmentId = dep.Id and dep.Id = 100

и все работает нормально.

Теперь я хочу выполнить предыдущий запрос для каждый идентификатор отдела и объединить все результаты. Примерно так (написано в псевдокоде):

Result <- empty
foreach depId in [Department].id
    Result = Result UNION run previous query with depId (insead of 100)

Как мне добиться этого с помощью SQL?

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Если в результатах требуется только id отдела (а не его имя), то объединение не требуется, поскольку этот идентификатор существует в таблице Employee. Используйте row_number() оконную функцию:

select e.Id, e.Salary, e.DepartmentId
from (
  select 
    Id, Salary, DepartmentId,
    row_number() over (partition by DepartmentId order by Salary desc) rn
  from Employee
) e
where e.rn <= 3
0 голосов
/ 07 октября 2019

Вы можете использовать APPLY

select t.Id, t.Salary, t.DepartmentId
from Department dep 
cross apply (
    select distinct top 3 e.Id, e.Salary, e.DepartmentId
    from Employee e
    where e.DepartmentId = dep.Id) t

Это вернет только Employee строк, для которых существует родительский элемент Department.

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