1. 程式人生 > 其它 >Excel & SQL | 資料預處理 | 02

Excel & SQL | 資料預處理 | 02

上表儲存了order_id(訂單ID)date (下單日期).value(訂單金額)、memberid(會員ID)、age (會員的年齡)、sex(會員的性別)和profession(所在行業資訊)七個欄位。我們把上表中的資料儲存在demo資料庫的chapter6表中。

缺失值處理

我們在資料庫中儲存的資料一般都會由於各種原因存在缺失值,我們需要對這部分資料進行處理。

一般處理方式有兩種:

  • 缺失值過濾
  • 缺失值填充

缺失值過濾

在SQL中,可以通過where進行過濾。

select * from chapter6 where profession!="";

!=表示不等於,""表示空值,缺失值有空格、null和空值三種表現形式


前兩種形式雖然也表示缺失值,但是在對應單元格內是有值的,而後一種空值是沒有值的,表示這個單元格什麼都沒有。

如果缺失值是用空格表示的要過濾缺失值, where後面就需要改成profession != " ";如果缺失值是用null表示的,要過濾掉缺失值, where後面就需要改成profession is not null

缺失值填充

上面的處理方式把profession列是缺失值的行都過濾掉了,所以這種處理方式會把其他非缺失值的欄位過濾掉,而造成資料的浪費。我們可以將profession列中的缺失值填充為其他,而不是直接過濾掉,這就是針對缺失值的第二種處理方式,使用的是coalesce()函式,具體實現程式碼如下:

select order_id,memberid,coalesce(profession,"其他") from chapter6;

重複值處理

我們在資料庫中儲存的資料有時候也會存在一些重複值,重複值會影響分析結果,所以我們也需要對這部分資料進行處理。

對重複值的處理,我們一般採取的方式是刪除重複值,即只保留重複資料中的一項,其他資料則被刪除。

在SQL中,我們可以使用distinct對查詢出來的全部結果進行刪除重複值的操作,需要注意的是,這裡不是針對全表進行刪除重複值的操作,而是針對查詢出來的全部結果,也就是select distinct後面的具體列進行刪除重複值的操作。如果是select distinct * ,則就是針對全表進行刪除重複值的操作了。

select distinct * from chapter6;

有時候,我們不需要對全表進行刪除重複值的操作,這個時候就可以根據具體需要選擇指定列進行刪除重複值的操作,比如,我們對chapter6表中的order_id列和memberid列進行刪除重複值的操作,具體實現程式碼如下︰

select distinct order_id,memberid from chapter6;

對重複值進行處理,我們除了可以使用distinct,還可以使用group by。

對想要刪除重複值的列進行group by就可以得到刪除重複值後的結果。

select order_id,memberid from chapter6 group by order_id,memberid;

執行上面程式碼,

資料型別轉換

一般我們會根據不同的需求,以及不同的場景對資料型別進行轉換,轉換成我們想要的資料型別。

在SQL中,我們想要更改某一列的資料型別,可以使用cast()和convert()函式。

cast(value as type)
convert(value,type)

上面兩個函式中的type表示某列更改為目標資料後的型別。目標資料型別包括如下表所示幾種。

我們將chapter6表中的age列從整型分別轉化為浮點型(decimal)和字元型(char)。

select age,cast(age as decimal) decimal_age,convert(age,char) char_age from chapter6;

重新命名

—般,公司資料庫中儲存的表的欄位名都是英文形式的,為了讓資料更加清晰,我們一般會將英文欄位名重新命名為中文欄位名﹔;或者一個欄位並不是表中現有的資料,而是通過表中現有的資料計算生成的,這個時候我們也需要對欄位名進行重新命名。

在SQL中,可以通過as來實現。as前面為原始欄位名,as後面為別名。

我們將chapter6表中所有英文欄位名全部重新命名為中文欄位名,具體實現程式碼如下:

select 
	order_id as "訂單ID",
	date as "下單日期",
	value as "訂單金額(元)",
	memberid as "會員ID",
	age as "年齡",
	sex as "性別",
	profession as "行業"
	from chapter6;

當然,上面程式碼中的as是可以省略的,直接以”原始欄位名 新欄位名“的形式也是可以的,但是為了讓程式碼更加可讀,建議不要省略。

小結

缺失值處理
	缺失值過濾 where 
		缺失值可能是 空格 空字元 null
		where xx!=""
		where xx!=" "
		where xx is not null
	缺失值填充 coalesce(屬性,填充值)
		select order_id,memberid,coalesce(profession,"其他") from chapter6;
	
重複值處理
	distinct 對後面查詢的列都進行去重
		select distinct order_id,memberid from chapter6;
	group by 要去重哪個列就對哪個列 group by
		select order_id,memberid from chapter6 group by order_id,memberid;
	
資料型別轉換
	cast(value as type)
	convert(value,type)
	select age,cast(age as decimal) decimal_age,convert(age,char) char_age from chapter6;
	
重新命名
	as(可以省略 原欄位名 新欄位名)
	select 
        order_id as "訂單ID",
        date as "下單日期",
        value as "訂單金額(元)",
        memberid as "會員ID",
        age as "年齡",
        sex as "性別",
        profession as "行業"
        from chapter6;