SQL Server:仅更新多个完全重复的记录中的一个

时间:2016-06-07 19:29:13

标签: sql-server ssis

这个让我烦恼。

我正在数据仓库登台表中工作,其中可能存在列值与其他列重复100%的行。有几十列,但为了这个论点,让我们使用以下示例:

tblExample (ID Int, Active bit, ModifiedDate DateTime)

现在,在任何给定时间,只有一个记录,每个ID的Active设置为1.所有其他记录的活动设置为0.有一个进程在数据加载期间强制执行此操作。

过去这个过程可能已经破裂,导致数据如下:

ID     Active ModifiedDate
123456 0      2016-05-27 12:37:46.111
123456 1      2016-05-27 12:37:46.433
123456 1      2016-05-27 12:37:46.433

在这种情况下,有2"相同" Active设置为1的记录。 我需要找到一种方法,只使其中一条记录有效= 1。

现在我用来执行此操作的过程当前假定Date值是唯一的,并且在99.99%的情况下是这种情况。但有时候日期也会重复。而且我无法为我的生活找到一种方法来更新这些记录中的单个记录,因为我没有什么可以为WHERE保留。

  • 我无法添加或修改架构。
  • 这一切都发生在内部,因此我受限于该平台固有的限制(有些事情在SSIS中效果不佳)

想法?

1 个答案:

答案 0 :(得分:3)

这应该有效:

with a as(
select *, ROW_NUMBER() OVER (PARTITION by ID, Active, ModifiedDate order by ModifiedDate) as rn from tblExample
)       

update a set active = 0 where rn >1
select * from tblExample;

Here is an example包含您的数据。

Row_number()上的欺骗创建一个ModifiedDate的CTE(因为您的解决方案适用于ModifiedDate的非欺骗行为)并更新CTE,更新您的数据。

如果您想更换流程,可以使用以下内容:

with a as(
select *, ROW_NUMBER() OVER (PARTITION by ID, Active order by ModifiedDate desc) as rn from tblExample
)

update a set active = 0 where rn >1
select *, ROW_NUMBER() OVER (PARTITION by ID, A order by ModifiedDate desc) as rn from tblExample;

这只允许每个ID的最新条目处于活动状态

Alternative solution