2014-05-06 90 views
0

我有一個包含通話記錄的表。有時,2個記錄被創建爲一個單一的電話。我有一個過程來比較呼叫時間(call_date),呼叫持續時間(持續時間),源號碼(src)和目的地號碼(dst)。如果所有4個字段完全匹配,則除一條記錄以外的所有字段都將被刪除當時間戳或數字不完全匹配時,刪除基於時間戳和數字的重複記錄

匹配src和dst是沒有問題的。但是,有時call_date會關閉1-2秒,或者持續時間會關閉幾分之一秒,從而防止重複被刪除。有時持續時間會縮短几毫秒,這也會阻止重複被刪除。

此外,持續時間是一個數字字段,以秒爲單位進行計算,並保留至小數點後3位。我可以將持續時間調整到最接近的秒數來捕捉很多重複記錄,但是如果一個記錄的持續時間是10.454秒而另一個記錄的是10.513,那麼它將分別舍入到10和11。我不能使用樓層或天花板功能,因爲在持續時間爲10.918和11.142秒時,我會遇到類似的問題。

所以我有數字和時間戳字段,即使它們是真正重複的記錄,也可以關閉一點點。有沒有辦法在查詢中添加一些「模糊空間」以在持續時間和時間戳的1秒差異內查找重複內容?

+1

也許會更容易不允許被記錄開始重複的電話? – McCee

+0

是的,我已經嘗試了這種方法,但至少在6個月內不可能在源頭上防止它。這與在語音服務器之間遷移客戶以及同時在舊服務器和新服務器之間路由呼叫有關。不是我的區域。 – rawk

+1

使用DATEDIFF(seconds,column1,column2)> 1'作爲日期列,並且'(duration1 - duration2)> 1'在這段時間內(注意:如果任一個持續時間可以是更大的值,加上'OR(duration2 - duration 1)> 1')。 – Turophile

回答

1

所以,這將是:

delete 
from table1 as a 
where exists (
    select 1 
    from table1 as b 
    where a.src = b.src 
    and a.dst = b.dst 
    and a.call_date >= b.call_date 
    and ABS(a.duration - b.duration) <= 1 
    and DATEDIFF(seconds,b.call_date,a.call_date) <= 1 
); 

這裏是我最終使用

delete from #tbl# where id in (
select a.id 
from #tbl# as a 
where a.call_date >= DateAdd(day, -31, GETDATE()) 
and a.duration_msec > 0 
and a.ani <> '' 
and a.transaction_id is null 
and exists (
    select 1 
    from #tbl# as b 
    where b.call_date >= DateAdd(day, -31, GETDATE()) 
    and b.duration_msec > 0 
    and b.ani <> '' 
    and b.transaction_id is null 
    and a.ani = b.ani 
    and (a.translated_num = b.translated_num or a.dialed_num = b.dialed_num) 
    and ABS(a.duration_msec - b.duration_msec) <= 1 
    and ABS(DATEDIFF(second,b.call_date,a.call_date)) <= 1 
    and a.id > b.id 
    ) 
) 
+1

**注:**我有'a.call_date> b.call_date'確保您刪除最早的一個,但如果日期完全相同,則兩者都將保留。我現在將代碼更改爲'a.call_date> = b.call_date',但如果它們完全相同,則會刪除它們。爲了避免這種情況,您需要一些其他測試來確定要保留哪一個。 – Turophile

+0

再次感謝。我也注意到了這一點。爲了這篇文章,我簡化了這個問題。這是我登陸的最後一個查詢: – rawk

+0

uhg ....不能將代碼整齊地放在註釋中。查看我的答案編輯。我有一個獨特的整數ID字段,我用來區分。 – rawk