这个让我烦恼。
我正在数据仓库登台表中工作,其中可能存在列值与其他列重复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保留。
想法?
答案 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
的最新条目处于活动状态