Sql Server Merge重复

时间:2017-10-13 12:03:23

标签: sql sql-server

所以我有一个这样的表,但每周更新大约3500条记录:

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是重复的并且RTYPE是不同的,我需要合并该对的行。如果有3个如上所述,我需要合并时间最接近的对,因此得到的表格如下所示

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

rtype和time字段实际上并不重要,因为如果需要可以删除这些字段,或者可以计算这些字段,并不重要。希望有人之前做过这类事,并有一些示例代码来完成这项工作。

这与之前发布的不一样!!!我没有删除重复项,我根据对比较和最接近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 个答案:

答案 0 :(得分: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

希望对你有帮助。