使用SQL語句去掉重複的記錄 兩種方法

2022-09-21 09:51:11 字數 2476 閱讀 1172

海量資料(百萬以上),其中有些全部欄位都相同,有些部分字段相同,怎樣高效去除重複?

如果要刪除手機(mobilephone),**(officephone),郵件(email)同時都相同的資料,以前一直使用這條語句進行去重:

delete from 表 where id not in

(select max(id) from 表 group by mobilephone,officephone,email )

or delete from 表 where id not in

(select min(id) from 表 group by mobilephone,officephone,email )

delete from 表 where id not in

(select max(id) from 表 group by mobilephone,officephone,email )

or delete from 表 where id not in

(select min(id) from 表 group by mobilephone,officephone,email ) www.cppcns.com

其中下面這條會稍快些。上www.cppcns.com面這條資料對於100萬以內的資料效率還可以,重複數1/5的情況下幾分鐘到幾十分鐘不等但是如果資料量達到300萬以上,效率驟降,如果重複資料再多點的話,常常會幾十小時跑不完,有時候會鎖表跑一夜都跑不完。無奈只得重新尋找新的可行方法,今天終於有所收穫:

//查詢出唯一資料的id,並把他們匯入臨時表tmp中

select min(id) as mid into tmp from 表 group by mobilephone,officephone,email

//查詢出去重www.cppcns.com後的資料並插入finally表中

insert into finally select (除id以外的字段) from customers_1 where id in (select mid from tmp)

//查詢出唯一資料的id,並把他們匯入臨時表tmp中

select min(id) as mid into tmp from 表 group by mobilephone,officephone,email

//查詢出去重後的資料並插入finally表中

insert into finally select (除id以外的字段) from customers_1 where id in (select mid from tmp)

效率對比:用delete方法對500萬資料去重(1/2重複)約4小時。4小時,很長的時間。

用臨時表插入對500萬資料去重(1/2重複)不到10分鐘。

其實用刪除方式是比較慢的,可能是邊找邊刪除的原因吧,而使用臨時表,可以將沒有重複的資料id選出來放在臨時表裡,再將表的資訊按臨時表的選擇出來的id,將它們找出來插入到新的表,然後將原表刪除,這樣就可以快速去重啦。

sql語句去掉重覆記錄,獲取重覆記錄

按照某幾個欄位名稱查詢表中存在這幾個欄位的重複資料並按照插入的時間先後進行刪除,條件取決於order by 和row_num。

方法一按照多條件重複處理:

dewww.cppcns.comlete tmp from(

select row_num = row_number() over(partition by 字段,字段 order by 時間 desc)

from 表 where getdate()-1

) tmp

where row_num > 1

delete tmp from(

select row_num = row_number() over(partition by 字段,字段 order by 時間 desc)

from 表 where getdate()-1

) tmp

where row_num > 1

方法二按照單一條件進行去重:

delete from 表 where 主鍵id not in(

select max(主鍵id) from 表 group by 需要去重的字段 h**ing count(需要去重的字段)>=1

) delete from 表 where 主鍵id not in(

select max(主鍵id) from 表 group by 需要去重的字段 h**ing count(需要去重的字段)>=1

)注意:為提高效率如上兩個方法都可以使用臨時表, not in 中的表可以先提取臨時表#tmp,

然後採用not exists來執行,為避免數量過大,可批量用top控制刪除量

delete top(2) from 表

where not exists (select 主鍵id

from #tmp where #tmp.主鍵id=表.主鍵id)

總結本文標題: 使用sql語句去掉重複的記錄【兩種方法】

本文位址:

用SQL語句去掉重複的記錄

有兩個意義上的重覆記錄,一是完全重複的記錄,也即所有欄位均重複的記錄,二是部分關鍵字段重複的記錄,比如name欄位重複,而其他欄位不一定重複或都重複可以忽略。1 對於第一種重複,比較容易解決,使用 select distinct from tablename 就可以得到無重覆記錄的結果集。如果該錶需...

sql去掉重覆記錄

第一種,資料全部重複,如下圖 需要得到以下的結果 刪除重複的記錄 重覆記錄保留1條 可以按以下方法刪除 1 seleet distinct into tmp from 表名23 drop table 表名45 select into 表名 from tmp67 drop table tmp 第二種,...

SQL去掉重覆記錄

第一種,資料全部重複,如下圖 需要得到以下的結果 刪除重複的記錄 重覆記錄保留1條 可以按以下方法刪除 1 seleet distinct into tmp from 表名23 drop table 表名45 select into 表名 from tmp67 drop table tmp 第二種,...