2017-10-13 66 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