【发布时间】:2019-10-21 18:23:30
【问题描述】:
我希望每个部门(EmpDepartment)都有一名员工,例如在我的表中有:
- EmpDepartment 1 的 3 名员工
- EmpDepartment 2 的 2 名员工和
- EmpDepartment 3 的 1 名员工
我想要来自每个单独部门的任何一名员工的 EmployeeId、EmployeeName 和 EmpDepartment。
【问题讨论】:
标签: sql sql-server tsql
我希望每个部门(EmpDepartment)都有一名员工,例如在我的表中有:
我想要来自每个单独部门的任何一名员工的 EmployeeId、EmployeeName 和 EmpDepartment。
【问题讨论】:
标签: sql sql-server tsql
使用这样的窗口函数:
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
【讨论】:
由于按 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
您可以根据需要将 order by 子句更改为其他内容。
【讨论】:
这将返回该部门中具有最小EmployeeID 的每个部门的员工(因为哪个员工将出现在结果中并不重要):
SELECT e.* FROM Employee e
WHERE NOT EXISTS (
SELECT 1 FROM Employee
WHERE EmpDepartment = e.EmpDepartment AND EmployeeID < e.EmployeeID
)
【讨论】:
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
【讨论】:
您可以使用 rownumber 来查找特定部门的任何员工,将 rn 更改为任何值,例如 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
【讨论】:
where rn = 2; 有意义的建议令人好奇。 OP 声明部门 3 有一名员工,因此检查 rn 以外的 1 值不会返回该部门的员工。