T-SQL复制,选择';大师;基于修改日期的记录
我有一个数据库,它有两个ID字段,一个由系统指定为GUID,另一个是ExternalID,用于表示数据清理后的重复项。表中还包含一个ModifiedDate 我正在尝试合并这些记录,最近修改的记录吸收了旧的帐户。我尝试了以下查询类型T-SQL复制,选择';大师;基于修改日期的记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个数据库,它有两个ID字段,一个由系统指定为GUID,另一个是ExternalID,用于表示数据清理后的重复项。表中还包含一个ModifiedDate 我正在尝试合并这些记录,最近修改的记录吸收了旧的帐户。我尝试了以下查询类型 SELECT a1.GUID ,a1.ModifiedDate ,a2.GUID ,a2,ModifiedDate FROM Accounts a1 INNER JOIN Accounts a2 on a1.ExternalID = a2.ExternalID
SELECT
a1.GUID
,a1.ModifiedDate
,a2.GUID
,a2,ModifiedDate
FROM Accounts a1
INNER JOIN Accounts a2 on a1.ExternalID = a2.ExternalID
不幸的是,这会导致重复帐户出现两次,一次用于主记录,另一次用于次级记录,后者将主记录作为副本返回
WITH Dup as (
SELECT 1 as track
,ExternalID DomEx
,ExternalID
,GUID DomGUID
,ModDate
from crm.Accounts
WHERE ExternalID is not null
UNION ALL
SELECT track +1
,OI.DomEx
,OG.ExternalID
,OG.GUID
,Og.ModDate
from crm.Accounts OG
INNER JOIN Dup OI on OI.ExternalID = OG.ExternalID
)
,
cte_dp as(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY ExternalID Order by track, ModDate desc) rn
FROM Dup
)
SELECT * FROM cte_dp
不幸的是,它达到了100的递归限制,如果该限制被转义,它将无限期地运行
为了呈现所需的结果,是否可以在此处更正逻辑,或者是否有更优雅的解决方案
+--------------+---------------------+--------------------+--+
| MasterGUID | SharedExternalID | SubordinateGUID | |
+--------------+---------------------+--------------------+--+
| (MasterGUID) | (SharedExternalID) | (SubordinateGUID) | |
| (MasterGUID) | (Shared ExternalID) | (SubordinateGUID) | |
+--------------+---------------------+--------------------+--+
是我理想情况下想要实现的结果,MasterGUID是两个副本之间最新修改日期的GUID
MERGE Accounts a1
USING Accounts a2
ON a1.ExternalID = a2.ExternalID
WHEN MATCHED THEN
UPDATE
SET a1.ModifiedDate = a2.ModifiedDate,
a1.guid = a2.guid;
SELECT * FROM Accounts a1;
是对称的,因此如果切换顺序,关系将具有相同的逻辑结果。因此,如果您找到这样一对(例如,self),那么它将在结果中出现两次。我们需要用一个附加条件来打破对称性:
a1.ExternalID = a2.ExternalID and a1.GUID < a2.GUID
a1.ExternalID=a2.ExternalID和a1.GUID
这将阻止与self连接。如果需要,您可以使用
union
,但现在我假设不需要。如果有另一个ExternalID
匹配,则如果左侧的GUID
比右侧小,则匹配将产生true,因此相反的结果将不为true,重复项将消失。如果发布示例数据,这将更容易,但这是您的意思吗
SELECT *
FROM (
select *
, ROW_NUMBER() OVER (PARTITION BY ExternalID ORDER BY ModifiedDate DESC) rnk
from accounts
) i
WHERE i.rnk = 1
你能发布样本和预期数据吗?以上编辑,谢谢
SELECT *
FROM (
select *
, ROW_NUMBER() OVER (PARTITION BY ExternalID ORDER BY ModifiedDate DESC) rnk
from accounts
) i
WHERE i.rnk = 1