我有一个包含重复项的数据库(dbo)。特别是,一名员工可以在同一业务(业务代码)中担任两个角色(角色编号),也可以在相同或不同区域(区号)的不同业务中担任两个/同一角色,如下所示:

我想要的是删除重复记录。因此,我创建了以下代码:
Select
dbo.year,
min(dbo.RoleNumber) AS Role,
min(dbo.AreaCode) AS Area,
min(dbo.BusinessCode) AS BCode,
dbo.EmployeeNumber
From dbo
Group by dbo.year, dbo.EmployeeNumber当个人在具有最低编号和最低区域(例如,我的示例中的第n* 3和4行)的企业中担任最低角色时,或者在重复记录中区号和业务代码相同(例如,第n* 1和2行)时,此代码工作得很好。
但是,在某些情况下,个人的最低角色与较高的业务代码或/和区号相关联。在这种情况下,SQL会创建组合这些元素的新记录,请参阅以下示例:
rows 5-10: 2018, 651, 5110, 3, 17;
rows 11-13: 2018, 649, 6215, 4, 20;
rows 14-15: 2018, 750, 5101, 5, 24.这本身并不是问题,但当我连接表以获取这些员工的额外数据时,这是有问题的。连接表的关键元素是面积、业务代码和雇员编号,但是在我的代码中,SQL正在创建其他表中不存在的新记录,这会导致额外的数据为空。
有没有办法解决这个问题?我需要SQL总是首先选择最低的角色编号,如果角色编号相同,那么应该选择最低的机构编号,如果相同,最后应该选择最低的区号。
因此,例如,我预计会像这样检索产生问题的三个记录:
rows 5-10: 2018, 651, 6319, 3, 17;
rows 11-13: 2018, 650, 6215, 4, 20;
rows 14-15: 2018, 750, 8076, 5, 24.谢谢
西尔维娅
发布于 2021-05-17 22:57:05
您可以使用窗口函数:
select * from
(
select * , row_number() over (partition by year, employeenumber order by rolenumber,businesscode,areacode) rn
from youratble
) t
where rn = 1你可以在窗口函数中使用order by来选择你想要的行。
https://stackoverflow.com/questions/67572035
复制相似问题