Выберите только одного сотрудника из каждого отдела - PullRequest
0 голосов
/ 21 октября 2019

My table schema and Data

Я хочу, чтобы по одному сотруднику из каждого отдела (EmpDepartment), например, в моей таблице было:

  • 3 сотрудника с EmpDepartment 1
  • 2 сотрудника с EmpDepartment 2 и
  • 1 сотрудник с EmpDepartment 3

Я хочу, чтобы EmployeeId, EmployeeName и EmpDepartment для каждого сотрудника из каждого отдельного отдела.

Ответы [ 5 ]

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

Используйте функцию управления окнами следующим образом:

SELECT *
FROM (
  SELECT 
     E.*,
     ROW_NUMBER() OVER (PARTITION BY EmpDepartment) AS RN
  FROM Employee
) X
WHERE X.RN = 1

Вы можете добавить условие заказа в функцию управления окнами, если у вас есть бизнес-правило, которое вы хотите использовать при выборе сотрудника

например,

  ROW_NUMBER() OVER (PARTITION BY EmpDepartment order by EmployeeId) AS RN
0 голосов
/ 21 октября 2019

Это вернет сотрудника из каждого отдела, имеющего минимум EmployeeID в этом отделе (поскольку не важно, какой сотрудник будет в результатах):

SELECT e.* FROM Employee e
WHERE NOT EXISTS (
  SELECT 1 FROM Employee 
  WHERE EmpDepartment = e.EmpDepartment AND EmployeeID < e.EmployeeID
)
0 голосов
/ 21 октября 2019
SELECT Top(1) EmployeeID, EmployeeName, EMPDeptartment  FROM Employee WHERE EmpDetpartment = 1

UNION

SELECT Top(1) EmployeeID, EmployeeName, EMPDeptartment  FROM Employee WHERE EmpDetpartment = 2

UNION

SELECT Top(1) EmployeeID, EmployeeName, EMPDeptartment  FROM Employee WHERE EmpDetpartment = 3
0 голосов
/ 21 октября 2019

Вы можете использовать округленное число, чтобы найти любого сотрудника определенного отдела, изменив рН на любое значение, равное 1,2, ... и т. Д.

Select department, employee
from (
   Select department, employee, 
      row_number() over (partition by department order by employee) rn
) 
where rn =1;

, или использовать простую группу по

Select department, max(employee)
from table 
group by department
0 голосов
/ 21 октября 2019

Это будет случайный сотрудник из каждого отдела из-за заказа по NEWID () ...

SELECT * FROM 
(
    SELECT EmployeeID, EmployeeName, EmployeeEmail
         , ROW_NUMBER() OVER (PARTITION BY EmpDepartment ORDER BY NEWID()) AS rn
    FROM   dbo.Employee
) x 
WHERE x.rn = 1

Вы можете изменить порядок по пункту на что-то другое, если хотите.

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