公司宣傳冊設(shè)計樣本免費下載江蘇搜索引擎優(yōu)化公司
工作中使用SQL對數(shù)據(jù)進(jìn)行處理計算時可能會遇到這樣的問題;讀取的表數(shù)據(jù)會有重復(fù),或者我們關(guān)注的幾個字段的數(shù)據(jù)會有重復(fù),直接使用原表數(shù)據(jù)會引起計算結(jié)果不準(zhǔn)或者做表連接時產(chǎn)生笛卡爾積。
本文記錄使用SQL進(jìn)行數(shù)據(jù)去重的幾種算法。
distinct關(guān)鍵字去重
distinct
關(guān)鍵字加在對應(yīng)字段前可以實現(xiàn)對改字段結(jié)果的去重查詢,distinct
同樣可以加在多個字段前實現(xiàn)按照多個字段結(jié)果的去重。
-- 單列去重
select distinct field_a
from tableName;
-- 多列去重
select distinct field_a,field_b,..
from tableName;
group by分組去重
使用group by
方法進(jìn)行去重的原理很簡單:按照某個或幾個字段進(jìn)行分組,那么每一組(分組字段取值相同)只會保留一條記錄,甚至可以在select分組字段后面使用聚合函數(shù)產(chǎn)生每組的一個聚合結(jié)果。
-- 分組去重實現(xiàn)
select field_a,field_b,field_c
from tableName
group by field_a,field_b,field_c;
-- 分組去重后加幾列聚合字段
select field_a,field_b,field_c,count(*),count(distinct field_d),sum(field_e)
from tableName
group by field_a,field_b,field_c;
窗口函數(shù)去重
窗口函數(shù)與聚合函數(shù)類似,聚合函數(shù)作用于分組后,對每組產(chǎn)生一個計算結(jié)果,窗口函數(shù)在OVER()里定義分組和排序,但是會對其中的每一行記錄進(jìn)行函數(shù)計算返回結(jié)果,其結(jié)果是沒有減少原表行數(shù)但是也達(dá)到了分組排序等計算結(jié)果。
-- 窗口函數(shù)去重實現(xiàn)
-- row_number()對每組原來n行數(shù)據(jù)產(chǎn)生1-n對應(yīng)的排序rk,即使有重復(fù)值rk會累加,也不會重復(fù),適合用來去重
with tmp_table as(
select*,row_number() over(partition by field_a,field_b order by field_c) as rk
fromtableName
)selectfield_a,field_b
fromtmp_table
where rk=1;