數據處理視頻教程實戰專題
(數據去重)
課程地址:http://edu.51cto.com/course/course_id-2131.html
作者:荷露叮咚網絡學苑
http://heludd.blog.51cto.com/
2014.5 北京
由於系統建設問題,用戶操作問題,接口問題等都會產生一些重複數據,當然有些是合理的冗餘。例如:系統程序未做唯一性約束(JS限制,數據庫約束),用戶雙擊提交按鈕時就提交了兩次,或者跨系統接口數據傳輸,只能追加數據。
當然,還有其它各種原因。
處理方法:查看重複數據、查看不重複數據、刪除重複數據。
本課程講解如何用Excel與數據庫(以Oracle爲例)進行數據查重、去重(去重有時需要取第一條記錄,有時需要取最新一條記錄,視不同應用情景採取不同方法)。
1. 用EXCEL處理重複數據
重複數據情況:單字段、多字段、全部字段。
1.1. 直接刪除法:
數據->數據工具->刪除重複項(直接刪除,但無法查看重複數據)
(可以選擇單列或連續的多列進行操作)
1.2. 高級篩選法:
(1)只選擇(查看、不刪除)不重複的數據:
數據->排序和篩選中的高級->彈出高級篩選對話框,設置列表區域和條件區域,並勾選“選擇不重複記錄” ->確定。
(2)顯示重複數據:
選擇“條件格式”->“突出顯示單元格規則”->“重複值”
選出重複值後再人工手動判斷保留哪些數據,刪除哪些數據。
1.3. 通過公式查詢:
查重複:
IF(COUNTIF(A:A,A2)>1,"重複","")
或者:
先排序再用公式IF(A2=A1, "重複","")
共計出現幾次:
=COUNTIF(B:B,B4)
第幾次出現:
=COUNTIF($B$2:B2,B2)
是否爲最新記錄:
=IF(G2=F2,"是","否") 第幾次出現與共計出現幾次相等時,爲最新記錄。
提示:多字段可用“&”合併成一字段進行操作哦; Excel2013能支持100萬條記錄,但對機器內存要求高,數據量大容易死機。另外CSV格式文件支持數據量更大(但只支持單個sheet) |
2. 用ORACLE處理重複數據常用方法
2.1. 用DISTINCT查詢不重複的數據
(1)只選擇單一字段去重:
select distinct fieldname from tablename |
(2)多字段去重:
select distinct fieldname1, fieldname2 from tablename |
(3)全部字段去重:
select distinct * from tablename |
2.2. 刪除重複記錄的方法:
(1)新建一張表,把原來的表刪除
Create table newtablename as select distinct * from tablename; Drop table oldtablename; Rename table newtablename to oldtablename; |
(2)直接刪除重複數據(重要數據不建議直接刪除,需在擴展環境下做,或提前備份)
Delete from newtablename where newtablename.fieldname1 not in () |
提示:在ORACLE中,多字段可用“||”合併字符串進行處理哦。 |
2.3. SQL: Group by
(1)查看重複記錄(一字段重複):
select * from tablename where fieldname in (select fieldname from tablename group by fieldname having count(fieldname) > 1) |
或者:
select fieldname1,fieldname2,count(distinct fieldname2) from tablename group by fieldname2 |
(2)查看重複記錄(多字段重複):
SELECT tablename.fieldname1,tablename.fieldname2,tablename.fieldname3 FROM tablename RIGHT OUTER JOIN (SELECT fieldname1, fieldname2 FROM tablename GROUP BY fieldname1, fieldname2 HAVING COUNT(fieldname1) > 1 AND COUNT(fieldname2) > 1) T ON tablename.fieldname1 = T.fieldname1 AND tablename.fieldname2 = T.fieldname2 |
或者:
select fieldname1,fieldname2,fieldname3 count(distinct fieldname1,fieldname2) from tablename group by fieldname1, fieldname2 |