2017-10-13 85 views
0

所以我有这样的一个表,但也有3500左右的记录,即每周更新:SQL服务器合并重复

OID UNIQUEID  RTYPE  TIME  OTHER 
1 ABC_20170215  SENT  12:30  item1 
2 ABC_20170215 RECEIVED 12:29  
3 ABC_20170215  SENT  12:35  item4 

那么什么,我试图做的是,如果UNIQUEID是一个副本,并舍入类型是不同的,我需要合并这一对的行。如果有3个类似上面,我需要合并对在时间上最接近,因此所得到的表看起来像下面

OID UNIQUEID  RTYPE   TIME   OTHER 
1 ABC_20170215 <whatever> <whatever>   item1 
3 ABC_20170215 <whatever> <whatever>   item4 

舍入类型和时间字段真的不太大的关系,因为这些领域可以被丢弃如果需要或者他们可以计算,并不重要。希望以前有人做过这种类型的事情,并有一些示例代码来实现这一点。

这是不一样的张贴之前!我不删除重复的,我基于对比较和时间差,把它们合并最接近0

所以我需要的是如果

UNIQUEID = UNIQUEID <- duplicates/matches 
and 
RTYPE != RTYPE <- different 

如果有多于一点的可能性,然后减去两者之间的时间,所以我的示例表

Pair1.Time - Pair1.Time = 1 (12.30-12.29) 
Pair2.Time - Pair2.Time = 6 (12.29-12.35) 

,并取最接近0,合并是对的,但有可能是诚实的无限集合的对可能性

+1

那么你的试用查询在哪里......? – Bhargav

+1

如果你有2或4条记录怎么办?什么规则适用于这些情况? –

+0

现在我没有任何东西,我知道,如果有更多的情况下,它可以变得复杂,我只是想要得到像上述场景一样简单的工作。 – KRL

回答

2

据我所知,我解决了解决方案。你可以试试这个吗? 我不是自信这是最好的解决方案。如果有人有更好的回答我也想看到的角度

;WITH cte AS 
(
    select t.OID, tm.UNIQUEID, tm.RTYPE, 
    ROW_NUMBER() OVER(PARTITION BY tm.UNIQUEID, tm.RTYPE ORDER BY t.OID) AS rno 
    from (
     select UNIQUEID, RTYPE 
     from MergeTable 
     group by UNIQUEID, RTYPE 
    ) tm 
    inner join mergeTable t on t.UNIQUEID = tm.UNIQUEID and t.RTYPE = tm.RTYPE 
) 

select * from cte where rno = 1 

在我的样本数据:

OID UNIQUEID  RTYPE  TIME OTHER 
1 ABC_20170215 SENT  12:30 item1 
2 ABC_20170215 RECEIVED 12:29 NULL 
3 ABC_20170215 SENT  12:31 item4 
4 ABC_20170216 SENT  12:32 item3 
查询运行后

OID UNIQUEID  RTYPE  TIME OTHER 
1 ABC_20170215 SENT  12:30 item1 
2 ABC_20170215 RECEIVED 12:29 NULL 
4 ABC_20170216 SENT  12:32 item3 

希望这对您有所帮助。

+0

@KRL答案如何?你可以试试吗? – arslanaybars

+0

但你有type = type而不是。它应该是类型<>类型,那么如果有多个可能的匹配,则减去时间。我编辑了我的问题,因为它可能看起来不太清楚 – KRL

+0

@KRL我在cte表中处理这个问题,我发现我们应该得到的所有行。当你尝试脚本时,它在你的数据中工作吗? – arslanaybars