删除重复 interval/history 重复项
Remove repeating interval/history duplication
给那个问题加上正确的标题有点困难,所以我会试着解释这个问题。我们使用 Oracle --> SQL Server 复制 JCC。它的工作方式是读取 Oracle 中的事务日志,然后在每次更改时发送 2 条语句:INSERT + UPDATE。因此,如果没有这样的记录,如果 SQL Server 中的记录已经存在,那么第一个 INSERT 将被插入由于 PK 违规而失败,然后它将尝试 UPDATE 记录。
现在我们正在尝试使用 SQL 服务器临时表 进行历史跟踪。当 JCC(复制)失败时问题就开始了,因为我们需要 re-play 日志。例如,复制在 11:01AM 处失败。为确保我们不会错过任何记录,我们需要重放,例如 10:45AM。它适用于普通表,但当我们处理时间表时,它只会破坏历史,并且历史变得不准确。
所以,现在是问题。如何识别这些记录并清理它们?
CREATE TABLE #temptable ( [UPDATE_DATE] datetime, [SysStart] datetime2(7), [SysEnd] datetime2(7), [key_column] char(8) )
INSERT INTO #temptable
VALUES
( N'2017-10-23T17:21:34', N'2017-10-23T21:21:44.5514785', N'2017-10-25T10:24:23.604867', '41862277' ),
( N'2017-10-23T16:21:43', N'2017-10-25T10:24:23.604867', N'2017-10-25T10:24:24.4954892', '41862277' ),
( N'2017-10-23T16:49:02', N'2017-10-25T10:24:24.4954892', N'2017-10-25T10:24:25.5111274', '41862277' ),
( N'2017-10-23T17:20:58', N'2017-10-25T10:24:25.5111274', N'2017-10-25T10:24:25.5111274', '41862277' ),
( N'2017-10-23T17:21:34', N'2017-10-25T10:24:25.5111274', N'2017-10-25T10:24:25.5111274', '41862277' ),
( N'2017-10-10T14:17:49', N'2017-10-20T14:25:24.7135228', N'2017-10-23T20:21:52.6602561', '41862277' ),
( N'2017-10-23T16:21:43', N'2017-10-23T20:21:52.6602561', N'2017-10-23T20:49:08.6122864', '41862277' ),
( N'2017-10-23T16:49:02', N'2017-10-23T20:49:08.6122864', N'2017-10-23T21:20:58.7073273', '41862277' ),
( N'2017-10-23T17:20:58', N'2017-10-23T21:20:58.7073273', N'2017-10-23T21:21:34.426412', '41862277' ),
( N'2017-10-23T17:21:34', N'2017-10-23T21:21:34.426412', N'2017-10-23T21:21:44.5514785', '41862277' )
DROP TABLE #temptable
预期结果:
此查询returns 您对提供的示例数据的预期结果。在 运行 删除语句
之前检查 CTE 内的查询
with cte as (
select
*, dr = dense_rank() over (partition by [key_column], cast([UPDATE_DATE] as date) order by cast([SysStart] as date))
from
#temptable
)
delete from cte
where dr > 1
给那个问题加上正确的标题有点困难,所以我会试着解释这个问题。我们使用 Oracle --> SQL Server 复制 JCC。它的工作方式是读取 Oracle 中的事务日志,然后在每次更改时发送 2 条语句:INSERT + UPDATE。因此,如果没有这样的记录,如果 SQL Server 中的记录已经存在,那么第一个 INSERT 将被插入由于 PK 违规而失败,然后它将尝试 UPDATE 记录。
现在我们正在尝试使用 SQL 服务器临时表 进行历史跟踪。当 JCC(复制)失败时问题就开始了,因为我们需要 re-play 日志。例如,复制在 11:01AM 处失败。为确保我们不会错过任何记录,我们需要重放,例如 10:45AM。它适用于普通表,但当我们处理时间表时,它只会破坏历史,并且历史变得不准确。
所以,现在是问题。如何识别这些记录并清理它们?
CREATE TABLE #temptable ( [UPDATE_DATE] datetime, [SysStart] datetime2(7), [SysEnd] datetime2(7), [key_column] char(8) )
INSERT INTO #temptable
VALUES
( N'2017-10-23T17:21:34', N'2017-10-23T21:21:44.5514785', N'2017-10-25T10:24:23.604867', '41862277' ),
( N'2017-10-23T16:21:43', N'2017-10-25T10:24:23.604867', N'2017-10-25T10:24:24.4954892', '41862277' ),
( N'2017-10-23T16:49:02', N'2017-10-25T10:24:24.4954892', N'2017-10-25T10:24:25.5111274', '41862277' ),
( N'2017-10-23T17:20:58', N'2017-10-25T10:24:25.5111274', N'2017-10-25T10:24:25.5111274', '41862277' ),
( N'2017-10-23T17:21:34', N'2017-10-25T10:24:25.5111274', N'2017-10-25T10:24:25.5111274', '41862277' ),
( N'2017-10-10T14:17:49', N'2017-10-20T14:25:24.7135228', N'2017-10-23T20:21:52.6602561', '41862277' ),
( N'2017-10-23T16:21:43', N'2017-10-23T20:21:52.6602561', N'2017-10-23T20:49:08.6122864', '41862277' ),
( N'2017-10-23T16:49:02', N'2017-10-23T20:49:08.6122864', N'2017-10-23T21:20:58.7073273', '41862277' ),
( N'2017-10-23T17:20:58', N'2017-10-23T21:20:58.7073273', N'2017-10-23T21:21:34.426412', '41862277' ),
( N'2017-10-23T17:21:34', N'2017-10-23T21:21:34.426412', N'2017-10-23T21:21:44.5514785', '41862277' )
DROP TABLE #temptable
预期结果:
此查询returns 您对提供的示例数据的预期结果。在 运行 删除语句
之前检查 CTE 内的查询with cte as (
select
*, dr = dense_rank() over (partition by [key_column], cast([UPDATE_DATE] as date) order by cast([SysStart] as date))
from
#temptable
)
delete from cte
where dr > 1