SQL:根据不同的标准删除重复项,实际创建新记录

SQL: removing duplicates based on different criteria, actually creates new records

我有一个包含重复项的数据库 (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)。

但是,在某些情况下,个人的最低角色与较高的业务代码 or/and 区号相关联。在这种情况下,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 正在创建其他表中不存在的新记录,这导致其他数据为 NULL。

有办法解决这个问题吗?我需要 SQL 总是先 select 最低的角色编号,如果角色编号相同,那么最低的机构编号应该 selected 如果相同,最低的区号应该终于 selected.

例如,我希望创建问题的三个记录会像这样检索:

rows 5-10:  2018, 651, 6319, 3, 17;
rows 11-13: 2018, 650, 6215, 4, 20;
rows 14-15: 2018, 750, 8076, 5, 24.

谢谢

西尔维娅

你可以使用window函数:

select * from 
  ( 
    select * , row_number() over (partition by year, employeenumber order by rolenumber,businesscode,areacode) rn 
    from youratble
  ) t
where rn = 1

您可以在 window 函数中使用 order by 来选择您想要的行。